在项目启动时(无request)获取Tomcat端口号

来源:互联网 发布:游戏美工收入 编辑:程序博客网 时间:2024/06/13 22:49

上一篇说的将非Spring Boot项目注册到Eureka Server并提供服务也说到,配置文件里eureka.port必须要与本机tomcat端口号相同,但不同环境往往有不同的tomcat端口号,以往我使用不同环境的配置文件以确保eureka服务端口与tomcat一致。

1.读tomcat配置文件

这是最先想到的方法,通过classpath一层层找到conf下的server.xml拿端口号,因为路径基本不会变,所以也是一种方法,由于发现了更好的方法,此处并无代码…

2.通过Jmx 的MBeanServer

package com.kowalski.demo;import javax.management.MBeanServer;import javax.management.MalformedObjectNameException;import javax.management.ObjectName;import javax.management.Query;import java.lang.management.ManagementFactory;import java.net.InetAddress;import java.net.UnknownHostException;import java.util.Set;public class IPAddressKowalski{    public static String getIpAddressAndPort() throws MalformedObjectNameException, NullPointerException,            UnknownHostException {        MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();        Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),                Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));        String host = InetAddress.getLocalHost().getHostAddress();        String port = objectNames.iterator().next().getKeyProperty("port");        String ipadd = "http" + "://" + host + ":" + port;        System.out.println(ipadd);        return ipadd;    }    public static int getTomcatPort() throws MalformedObjectNameException, NullPointerException {        MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();        Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),                Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));        String port = objectNames.iterator().next().getKeyProperty("port");        return Integer.valueOf(port);    }}

那么之前写的将非Boot项目注册到eureka server上怎么动态的拿tomcat端口号呢:

在之前的MyInstanceConfig 中加入方法:

/***     *获取本机启动中tomcat端口号     * @return     */    @Override    public int getNonSecurePort(){        int tomcatPort;        try {            MBeanServer beanServer = ManagementFactory.getPlatformMBeanServer();            Set<ObjectName> objectNames = beanServer.queryNames(new ObjectName("*:type=Connector,*"),                    Query.match(Query.attr("protocol"), Query.value("HTTP/1.1")));            tomcatPort = Integer.valueOf(objectNames.iterator().next().getKeyProperty("port"));        }catch (Exception e){            return super.getNonSecurePort();        }        return tomcatPort;    }

这里的getNonSecurePort其实就是config.properties里面配置的eureka.port可以在PropertiesInstanceConfig的init方法中找到

原创粉丝点击