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

上一篇说的将非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方法中找到

发布了26 篇原创文章 · 获赞 68 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/qq_32193151/article/details/73609198