使用JMX的多个Java应用程序

使用JMX的多个Java应用程序,java,jmx,Java,Jmx,我对JMX非常陌生,我试图实现以下目标:我想使用JMX监视同一Java应用程序的多个实例。问题是,此应用程序可能同时运行多次。我需要从另一个(远程)主机监视JMX值的可能性 Java应用程序示例: public class Test { public static void main(String[] args) { while(true) { try { Thread.sleep(1000); System.out.println("I'

我对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
,我可以使用
jconsole
连接到
1.2.3.4:1412
但是:如果不修改端口,我就无法再次运行此应用程序,因为应用程序无法再次绑定到端口,这是非常合乎逻辑的

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

我可以使用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
您还可以使用
端口=0
来获得“动态”RMI端口,但我不确定您将如何远程查看该端口


您可以考虑使用我的包,这使得JMX bean的整个发布变得非常容易。它还允许您以编程方式轻松地将JMX发布到不同的端口。

请参阅我对您的其他问题的回答:

您可以将端口设置为0,然后打开日志记录,以便可以看到所选的端口,如下所示:

我认为在JMX之前需要另一个进程来获取端口,否则我认为这是不可能的。相关内容:我已经阅读了这个问题,但我不知道要让它运行我必须做些什么…感谢您的回答,但这要求我不能使用同一命令行运行同一命令两次。我希望JVM有可能获得一个随机端口,以后我可以连接到这个端口。JMX不是这样工作的@theomega。如果要从远程TCP端口连接到端点,则需要定义端点。该TCP端口必须是唯一的。您还需要jconsole的端口才能连接到它。这不可能是随机的。RMI呢?出于这个原因,这能被使用吗?将端口设置为
0
怎么样。它似乎以某种方式随机端口,我能够连接到它,也许这是一个解决方案?我不知道端口=0支持。但是,我不知道如何远程工作,因为您仍然需要找到能够连接到它的端口@theomega.Yep,这就是port=0设置的问题。如果已修复,您将能够在不修改日志记录配置的情况下查看端口。