Я попытался включить удаленное взаимодействие JMX в приложении Java, запущенном на сервере, добавив аргументы JVM -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
, но мне не удалось подключиться к приложению. Не зная, что приложение что-то испортило, я написал простое тестовое приложение:
public class Main {
public static void main(String[] args) {
while (true) {
try {
System.out.println("Sleeping for 5 seconds...");
Thread.sleep(5000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Однако мне тоже не удалось подключиться к этому приложению. iptables показывает открытый порт на 9001, а netstat подтверждает, что соединение установлено, но Jconsole (и простой скрипт Groovy) не работает из-за тайм-аута.
Поскольку до сих пор не удалось устранить неполадки, я искал альтернативные способы подключения Jconsole. Решения включают установку нового веб-сервера и маршрутизацию JMX через него, но, вероятно, для меня это невозможно. В коробке есть веб-сервер, но это Hiawatha, и я не могу его изменить или установить другой. Что я пропустил?
Попробуйте выполнить следующие действия, чтобы устранить неполадки и сообщить об этом:
Вы можете использовать telnet xxx.xxx.xxx.xxx 9001
откуда вы запускаете jconsole. Тебе следует увидеть:
Подключен к xxx.xxx.xxx.xxx Escape-символ - '^]'.
Если вы это видите, значит, у вас есть TCP-соединение, поэтому проблема не в брандмауэрах.
Выполните следующую команду на сервере и опубликуйте вывод:
$ netstat -an | grep LISTEN | grep 9001 tcp6 0 0 ::: 9001 ::: * СЛУШАТЬ
Ваш класс и ваша командная строка:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Main
у меня работает нормально, я могу подключиться к jconsole.
java -version