Ответ 1
Добавить -Djava.rmi.server.hostname = host ip
. Даже я столкнулся с той же проблемой, и это сделало трюк.
Добавление этого -Djava.rmi.server.hostname = host ip
заставляет службу RMI использовать IP-адрес хоста вместо 127.0.0.1
По какой-то странной причине я не могу подключиться с помощью 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)
В чем проблема?
Добавить -Djava.rmi.server.hostname = host ip
. Даже я столкнулся с той же проблемой, и это сделало трюк.
Добавление этого -Djava.rmi.server.hostname = host ip
заставляет службу RMI использовать IP-адрес хоста вместо 127.0.0.1
Вот шаги, которые помогли мне (Debian за брандмауэром на стороне сервера был доступен через VPN с моего локального Mac):
Проверьте публичный ip сервера
ifconfig
Используйте параметры 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]
Запустить приложение
Найти идентификатор запущенного Java-процесса
Проверьте все порты, используемые JMX/RMI
netstat -lp | grep [pid from step 4]
Откройте все порты с шага 5 на брандмауэре
Вуаля.
В дополнение к прослушиванию указанного вами порта (1100) сервер JMX также прослушивает случайно выбранный (эфемерный) порт. Проверьте, например. с lsof -i|grep java
, если вы находитесь в linux/osx, который порты Java-процесса прослушивают, и убедитесь, что ваш брандмауэр открыт и для эфемерного порта.
У меня возникла проблема, когда он сказал "Добавить" навсегда и, похоже, не смог подключиться. Я получил проблему, изменив настройки прокси-сервера 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"
У меня была аналогичная проблема при использовании переадресации портов.
У меня есть удаленная машина с 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?), прослушивающей тот же порт.
Также посмотрите правильную настройку параметров.
Я нашел проблему, моя служба rmi была запущена на IP-адресе хоста, который был "127.0.0.1". Чтобы подключиться удаленно к jvm, мне пришлось привязать внешний ip к имени хоста. Для этого в системах unix используйте команду hostname
, чтобы получить имя имени хоста. Затем проверьте ip, которому присвоено имя хоста, чтобы узнать, как это использовать ping $(hostname)
, вы увидите, что система пингорует hosname ip. Если ваш IP-адрес хоста был по умолчанию "127.0.0.1", и вы хотели его изменить, просто отредактируйте файл /etc/hosts как суперпользователь. После перезагрузки службы rmi вы можете связаться с ней с удаленной машины.
Если вы запускаете файл jar
(с помощью опции -jar), вы должны указать все остальные опции перед -jar
!
Поскольку я только что присоединился, я не могу высказать ответ хетта, но это спасло мою жизнь от очередной недели проб и ошибок!
Это пример рабочего 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
загляните в /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 и забудь другой
Мои два цента на приведенные выше ответы..
Я вижу, что большинство ответов упоминается только об именах хостов, но без порта. Если мы не указали порты, то сервер будет динамически назначать порт RMI. Не будет никаких проблем, если оба сервера находятся в одной подсети или нет проблем с брандмауэром. Если есть какие-либо проблемы, мы можем добавить ниже параметр JVM, чтобы заморозить.
-Dcom.sun.management.jmxremote.rmi.port
Ex:
<option name="-Dcom.sun.management.jmxremote.rmi.port" value="11001"/>
Убедитесь, что оба порта RMI и JMX должны быть одинаковыми. Для получения дополнительной информации нажмите здесь