Я очень новичок в 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
. Но: я не могу запустить это приложение во второй раз без изменения порта, что вполне логично, поскольку приложение не может привязаться к порту во второй раз.
Как запустить одно и то же приложение несколько раз (с одной и той же командной строкой!), а затем подключиться к нескольким экземплярам?