Подтвердить что ты не робот

Не удается удаленно подключиться к JMX?

По какой-то странной причине я не могу подключиться с помощью VisualVM или jconsole к JMX.

Параметры, используемые для запуска контролируемой виртуальной машины:

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

Я проверил, и я могу использовать telnet для этого порта, как локально, так и удаленно.

Тем не менее, VisualVM или jconsole не могут подключиться, потратив некоторое время на попытки.

REMOTE MACHINE with JMX (debian)
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)

MY WORKSTATION (OS X)
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)

В чем проблема?

4b9b3361

Ответ 1

Добавить -Djava.rmi.server.hostname = host ip. Даже я столкнулся с той же проблемой, и это сделало трюк.

Добавление этого -Djava.rmi.server.hostname = host ip заставляет службу RMI использовать IP-адрес хоста вместо 127.0.0.1

Ответ 2

Вот шаги, которые помогли мне (Debian за брандмауэром на стороне сервера был доступен через VPN с моего локального Mac):

  1. Проверьте публичный ip сервера

    ifconfig

  2. Используйте параметры JVM:

    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=[jmx port]
    -Dcom.sun.management.jmxremote.local.only=false
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false
    -Djava.rmi.server.hostname=[server ip from step 1]
  1. Запустить приложение

  2. Найти идентификатор запущенного Java-процесса

  3. Проверьте все порты, используемые JMX/RMI

    netstat -lp | grep [pid from step 4]

  4. Откройте все порты с шага 5 на брандмауэре

Вуаля.

Ответ 3

В дополнение к прослушиванию указанного вами порта (1100) сервер JMX также прослушивает случайно выбранный (эфемерный) порт. Проверьте, например. с lsof -i|grep java, если вы находитесь в linux/osx, который порты Java-процесса прослушивают, и убедитесь, что ваш брандмауэр открыт и для эфемерного порта.

Ответ 4

У меня возникла проблема, когда он сказал "Добавить" навсегда и, похоже, не смог подключиться. Я получил проблему, изменив настройки прокси-сервера jvisualvm (Tools- > options- > network). Как только я изменил параметр No Proxy, я смог подключиться. Мой jvm был запущен со следующими параметрами:

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=2222 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Djava.rmi.server.hostname=<external_IP_of_server> 

Затем, когда я добавил соединение jmx, я указал "external_IP_of_server: 2222"

Ответ 5

У меня была аналогичная проблема при использовании переадресации портов. У меня есть удаленная машина с Tomcat, которая прослушивает JMX-взаимодействия на localhost:9000.

На моей локальной машине я использую переадресацию портов с помощью:

ssh -L 9001:localhost:9000 tomcat.example.com

(поэтому удаленный порт 9000 перенаправляется на мой локальный порт 9001).

Затем, когда я попытался использовать VisualVM для подключения к localhost:9001, было отказано в соединении. Кажется, что JMX требует, чтобы номера портов с обеих сторон были одинаковыми.

Итак, в моем решении использовались номера портов 9000 и 9000:

    ssh -L 9000:localhost:9000 tomcat.example.com

Теперь моя локальная машина VisualVM успешно подключается к удаленному компьютеру Tomcat через localhost:9000.

Убедитесь, что у вас нет другой службы (Tomcat on dev machine?), прослушивающей тот же порт.

Также посмотрите правильную настройку параметров.

Ответ 6

Я нашел проблему, моя служба rmi была запущена на IP-адресе хоста, который был "127.0.0.1". Чтобы подключиться удаленно к jvm, мне пришлось привязать внешний ip к имени хоста. Для этого в системах unix используйте команду hostname, чтобы получить имя имени хоста. Затем проверьте ip, которому присвоено имя хоста, чтобы узнать, как это использовать ping $(hostname), вы увидите, что система пингорует hosname ip. Если ваш IP-адрес хоста был по умолчанию "127.0.0.1", и вы хотели его изменить, просто отредактируйте файл /etc/hosts как суперпользователь. После перезагрузки службы rmi вы можете связаться с ней с удаленной машины.

Ответ 7

Если вы запускаете файл jar (с помощью опции -jar), вы должны указать все остальные опции перед -jar !

Ответ 8

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

Это пример рабочего Dockerfile:

FROM store/oracle/serverjre:8 

RUN mkdir -p /opt/app

ENV APP_PATH /opt/app

WORKDIR $APP_PATH   

COPY . $APP_PATH

CMD ["java", \
     "-Dcom.sun.management.jmxremote", \
     "-Dcom.sun.management.jmxremote.port=9010", \
     "-Dcom.sun.management.jmxremote.rmi.port=9010", \
     "-Dcom.sun.management.jmxremote.authenticate=false", \
     "-Dcom.sun.management.jmxremote.ssl=false", \
     "-Djava.rmi.server.hostname=12.345.67.89", \
     "-jar", \
     "app-service-0.0.1-SNAPSHOT.jar"]

EXPOSE 9010

Ответ 9

загляните в /etc/hosts, если у вас нет неправильного IP для вашей машины пример : 127.0.0.1 localhost 127.0.0.2 your_machine 185.12.58.2 your_machine (хороший IP для вашей машины)

JMX возьми IP 127.0.0.2 и забудь другой

Ответ 10

Мои два цента на приведенные выше ответы..

Я вижу, что большинство ответов упоминается только об именах хостов, но без порта. Если мы не указали порты, то сервер будет динамически назначать порт RMI. Не будет никаких проблем, если оба сервера находятся в одной подсети или нет проблем с брандмауэром. Если есть какие-либо проблемы, мы можем добавить ниже параметр JVM, чтобы заморозить.

-Dcom.sun.management.jmxremote.rmi.port

Ex:

<option name="-Dcom.sun.management.jmxremote.rmi.port" value="11001"/>

Убедитесь, что оба порта RMI и JMX должны быть одинаковыми. Для получения дополнительной информации нажмите здесь