
默认情况下,JMX可在本地自动访问,因此在
jconsole本地运行将检测到所有本地Java应用程序而不会暴露端口。
要通过JMX 远程访问应用程序,必须指定一个RMI注册表端口。要知道的是,在连接时,JMX在该端口上初始化,然后在随机的高端口上建立数据连接,如果中间有防火墙,这将是一个很大的问题。
要强制JMX在建立的端口上重新连接,你有两种选择:
选项1:命令行
-Dcom.sun.management.jmxremote.port=$JMX_REGISTRY_PORT -Dcom.sun.management.jmxremote.rmi.port=$RMI_SERVER_PORT
如果你使用的是Spring Boot,则可以将其放入(appname).conf与(appname).jar部署一起存在的文件中。
选项2:Tomcat / Tomee配置
配置一个JmxRemoteLifecycleListener:
Maven Jar:
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina-jmx-remote</artifactId> <version>8.5.9</version> <type>jar</type> </dependency>
配置你的server.xml:
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
选项3:以编程方式配置
@Configurationpublic class ConfigureRMI { @Value("${jmx.rmi.host:localhost}") private String rmiHost; @Value("${jmx.rmi.port:1099}") private Integer rmiPort; @Bean public RmiRegistryFactoryBean rmiRegistry() { final RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean(); rmiRegistryFactoryBean.setPort(rmiPort); rmiRegistryFactoryBean.setAlwaysCreate(true); return rmiRegistryFactoryBean; } @Bean @DependsOn("rmiRegistry") public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception { final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean(); connectorServerFactoryBean.setObjectName("connector:name=rmi"); connectorServerFactoryBean.setServiceUrl(String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", rmiHost, rmiPort, rmiHost, rmiPort)); return connectorServerFactoryBean; }}你将看到的窍门是
serviceUrl在其中指定jmx:rmi主机/端口和jndi:rmi主机/端口。如果同时指定两者,则不会出现随机的高“问题”。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)