我是JMX的新手,我尝试实现的目标如下:我想使用JMX来监视同一Java-Application的多个实例。问题是,此应用程序可能同时运行多次。我需要监视来自另一个(远程)主机的JMX值。
示例Java-Application:
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
。 但是:我无法在不修改端口的情况下第二次运行此应用程序,这非常符合逻辑,因为应用程序无法再次绑定到端口。
如何多次运行相同的应用程序(使用相同的命令行!)然后连接到多个实例?
答案 0 :(得分:1)
我可以使用jconsole连接到1.2.3.4:1412。但是:我无法在不修改端口的情况下第二次运行此应用程序,这非常符合逻辑,因为应用程序无法再次绑定到端口。
您的每个JVM都必须位于不同的端口上。
如何多次运行相同的应用程序(使用相同的命令行!)然后连接到多个实例?
通过在不同的端口上运行它们:
java -Dcom... -Dcom.sun.management.jmxremote.port=1412 Test
java -Dcom... -Dcom.sun.management.jmxremote.port=1413 Test
您也可以使用port=0
获取“动态”RMI端口,但我不确定您将如何远程查看。
您可以考虑使用我的SimpleJMX包,这使得整个JMX bean的发布变得非常容易。它还允许您轻松地以可编程方式将JMX发布到不同的端口。
答案 1 :(得分:1)
在另一个问题上查看我的回答: Enable JMX in Hadoop Job
您可以设置port = 0,然后打开日志记录,以便您可以看到按此处所示选择的端口: https://forums.oracle.com/message/4798165#4798165