1

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

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

4

2 回答 2

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 发布到不同的端口。

于 2013-07-23T14:44:55.963 回答
1

请参阅我对您的其他问题的回答: 在 Hadoop 作业中启用 JMX

您可以设置 port=0,然后打开日志记录,这样您就可以看到这里选择的端口: https ://forums.oracle.com/message/4798165#4798165

于 2013-10-25T17:31:22.103 回答