默认情况下,JMX 可在本地自动访问,因此运行jconsole
locally将检测所有本地 Java 应用程序,而无需暴露端口。
通过 JMX 访问应用程序remotely您必须指定 RMI 注册表端口。需要知道的是,连接时,JMX 在该端口上进行初始化,并且then建立数据连接随机高端口,如果中间有防火墙,这将是一个大问题。 (“嘿,系统管理员,打开所有内容,好吗?”)。
要强制 JMX 连接回您已建立的同一端口,您有以下几个选项。注意:您可以对 JMX 和 RMI 使用不同的端口,也可以使用相同的端口。
选项 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 https://tomcat.apache.org/tomcat-7.0-doc/config/listeners.html#JMX_Remote_Lifecycle_Listener_-_org.apache.catalina.mbeans.JmxRemoteLifecycleListener:
Maven 罐子:
<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:以编程方式配置
@Configuration
public 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 主机/端口。如果您同时指定两者,则不会遇到随机高“问题”。
Edit:为了使 JMX 远程处理正常工作,您需要做出有关身份验证的决定。最好分 3 个不同的步骤来完成:
- 基本设置与
-Dcom.sun.management.jmxremote.authenticate=false
then
- 添加一个
密码文件(
-Dcom.sun.management.jmxremote.password.file
). 看
此处获取说明。 https://docs.oracle.com/en/java/javase/11/management/monitoring-and-management-using-jmx-technology.html#GUID-08484F70-31A5-4B87-A7DD-2BCCD2E6580D +
-Dcom.sun.management.jmxremote.ssl=false
进而
- 设置 SSL。