我对 JMX 很陌生,我尝试实现以下目标:我想使用 JMX 来监视同一 Java 应用程序的多个实例。问题是,这个应用程序可能会同时运行多次。我需要监控来自另一个(远程)主机的 JMX 值的可能性。
示例 Java 应用程序:
public class Test {
public static void main(String[] args) {
while(true) {
try {
Thread.sleep(1000);
System.out.println("I'm running");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
编译使用javac Test.java
然后执行使用
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djava.net.preferIPv4Stack=true \
Test
应用程序现在运行,但我不知道如何从以下位置连接到此进程jconsole
:我可以netstat
用来找出 JVM 侦听的端口,但我无法连接,因为我在连接时收到“表中没有此类对象”异常。
如果我使用它运行它
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djava.net.preferIPv4Stack=true \
-Dcom.sun.management.jmxremote.port=1412 \
Test
,我可以连接到1.2.3.4:1412
使用jconsole
。但是:我无法在不修改端口的情况下再次运行此应用程序,这是非常合乎逻辑的,因为应用程序无法再次绑定到端口。
如何多次运行同一个应用程序(使用相同的命令行!)然后连接到多个实例?