使用JMX的多个Java应用程序

时间:2013-07-23 14:15:59

标签: java jmx

我是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但是:我无法在不修改端口的情况下第二次运行此应用程序,这非常符合逻辑,因为应用程序无法再次绑定到端口。

如何多次运行相同的应用程序(使用相同的命令行!)然后连接到多个实例?

2 个答案:

答案 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