Отладка подключения JConsole

У меня есть веб-приложение, развернутое на удаленном смоляном сервере, и у него включен JMX.

Я могу установить telnet на удаленный сервер i.e

[email protected]:/tmp$ telnet <remote-ip> 5555
Trying <remote-ip>...
Connected to <remote-ip>.
Escape character is '^]'.
��sr5javax.management.remote.message.HandshakeBeginMessage�,���6profilestLjava/lang/String;Lversionq~xppt1.0^]

telnet> q
Connection closed.

Но я не могу подключиться к нему с помощью JConsole

$JAVA_HOME/bin/java -cp $JAVA_HOME/lib/jconsole.jar:$JAVA_HOME/lib/tools.jar:pm-common/lib/jmxremote_optional-1_0_1_3.jar sun.tools.jconsole.JConsole service:jmx:jmxmp://<remote-ip>:5555

Я пробовал это со следующими версиями Java, но в обоих случаях получаю сообщение "Сбой соединения".

## where JAVA_HOME=/opt/java/64/jdk1.5.0_22
java version "1.5.0_22"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03)
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode)

## where JAVA_HOME=/opt/java/64/jdk1.6.0_17
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

Есть ли у вас какая-либо идея относительно того, как отлаживать это (например, выяснить, что не так)?

Ответы

Ответ 1

Убедитесь, что вы запускаете свое приложение со следующими настройками java

-Dcom.sun.management.jmxremote.port=9005
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Попробуйте подключиться сейчас. Если вы хотите отладить это, вы можете запустить jconsole с помощью следующей команды

jconsole -J-Djava.util.logging.config.file=path_to_logging.properties_for_jconsole

Ниже приведено содержимое файла logging.properties

Logging.properties

handlers = java.util.logging.ConsoleHandler


.level = INFO

java.util.logging.ConsoleHandler.level = FINEST

java.util.logging.ConsoleHandler.formatter = \

java.util.logging.SimpleFormatter

// Use FINER or FINEST for javax.management.remote.level - FINEST is

// very verbose...

javax.management.level = FINEST

javax.management.remote.level = FINER

Как только вы запустите jconsole, откроется окно со списком журналов.

Ответ 2

Если вы запустите jconsole -debug, это даст вам больше информации о диагностике при сбое. ссылка: http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole Я сделал это, и это показало мне, что я использовал 32-битную jconsole, когда они были запущены с другим 64-битным jvm, поэтому, по-видимому, это не разрешено, и он терпел неудачу.

Ответ 3

Это, наконец, заставило меня работать для меня: Предоставляя эту дополнительную опцию: -Djava.rmi.server.hostname=<ip addres where jvm is running

Итак, все аргументы vm, используемые для открытия jconsole с удаленной машины, jvm на удаленной машине необходимо запустить с помощью

 -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.port=<port> -Dcom.sun.management.jmxremote -com.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<ip address>

Весь процесс указан здесь

Ответ 4

Я столкнулся с той же проблемой при запуске Java-процесса через cygwin. JConsole не может подключиться. Начал работу с win7-cmd, все работает так, как ожидалось.

Ответ 5

Я не знаю, полезно ли это, но, возможно, вы должны использовать двоичный файл jconsole в каталоге bin JDK, а не использовать недокументированное (и подлежащее изменению) солнце. * классы для запуска консоли

Ответ 6

Если ваше приложение работает на JDK 1.6, вы можете его подключить. Если он использует JDK до 1.6, запустите его, указав следующий аргумент JVM

-Dcom.sun.management.jmxremote

Ответ 7

У меня была аналогичная проблема с тем, что удаленный компьютер находился за брандмауэром, а брандмауэр блокировал порты, определенные -Dcom.sun.management.jmxremote.port и RMI 46924. После того, как я разрешил мне подключиться к этому порту, я успешно подключился.