Удаленное соединение JMX - PullRequest
87 голосов
/ 07 мая 2009

Я пытаюсь открыть соединение JMX с Java-приложением, запущенным на удаленной машине.

Приложение JVM настроено со следующими параметрами:

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management.jmxremote.authenticate = ложь
  • com.sun.management.jmxremote.ssl = ложь

Я могу подключиться, используя localhost:1088, используя jconsole или jvisualvm. Но я не могу подключиться с помощью xxx.xxx.xxx.xxx:1088 с удаленного компьютера.

Нет межсетевого экрана между серверами или в ОС. Но чтобы исключить эту возможность, я telnet xxx.xxx.xxx.xxx 1088, и я думаю, что он подключается, как экран консоли гаснет.

Оба сервера являются Windows Server 2008 x64. Пробовал с 64-битной JVM и 32-битной, ни одна не работает.

Ответы [ 11 ]

109 голосов
/ 07 мая 2009

Если бы в Linux была проблема, то localhost - это петлевой интерфейс , вам необходимо приложение для привязки к сетевому интерфейсу .

Вы можете использовать netstat для подтверждения того, что он не связан с ожидаемым сетевым интерфейсом.

Вы можете выполнить эту работу, вызвав программу с системным параметром java.rmi.server.hostname="YOUR_IP", либо как переменную среды, либо с помощью

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
59 голосов
/ 25 июля 2012

Я потратил больше суток, пытаясь заставить JMX работать за пределами localhost. Похоже, что SUN / Oracle не смогли предоставить хорошую документацию по этому вопросу.

Убедитесь, что следующая команда возвращает вам реальный IP-адрес или имя хоста. Если он возвращает что-то вроде 127.0.0.1, 127.0.1.1 или localhost, он не будет работать, и вам придется обновить файл /etc/hosts.

hostname -i

Вот команда, необходимая для включения JMX даже извне

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

Где, как вы и предполагали, myserver.example.com должен совпадать с тем, что возвращает hostname -i.

Очевидно, вы должны быть уверены, что брандмауэр не блокирует вас, но я почти уверен, что это не ваша проблема, проблема в том, что последний параметр не задокументирован.

19 голосов
/ 05 октября 2016

В моем тестировании с Tomcat и Java 8 JVM открывала временный порт в дополнение к порту, указанному для JMX. Следующий код исправил меня; Попробуйте, если у вас возникли проблемы, когда ваш клиент JMX (например, VisualVM не подключается.

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

Также см. Почему Java открывает 3 порта при настройке JMX?

12 голосов
/ 09 сентября 2011

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

Если вы пытаетесь получить доступ к серверу, который находится за NAT - вам, скорее всего, придется запустить сервер с параметром

-Djava.rmi.server.hostname=<public/NAT address>

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

8 голосов
/ 18 июня 2010

кажется, что ваша окончательная цитата приходит слишком рано. Должно быть после последнего параметра.

Этот трюк сработал для меня.

Я заметил кое-что интересное: когда я запускаю свое приложение, используя следующую командную строку:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

Если я пытаюсь подключиться к этому порту с удаленного компьютера с помощью jconsole, соединение TCP успешно выполняется, некоторые данные обмениваются между удаленным jconsole и локальным агентом jmx, где развернут мой MBean, а затем jconsole отображает сообщение об ошибке подключения. Я выполнил захват Wireshark, и он показывает обмен данными как от агента, так и от jconsole.

Таким образом, это не проблема сети, если я выполняю netstat -an с или без системного свойства java.rmi.server.hostname, у меня есть следующие привязки:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

Это означает, что в обоих случаях сокет, созданный на порту 9999, принимает подключения с любого хоста по любому адресу.

Я думаю, что содержимое этого системного свойства используется где-то при соединении и сравнивается с фактическим IP-адресом, используемым агентом для связи с jconsole. И если эти адреса не совпадают, соединение не устанавливается.

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

5 голосов
/ 02 декабря 2014

для меня работало то, что я установил / etc / hosts, чтобы указывать имя хоста на ip, а не на интерфейс обратной связи, а затем перезапускал мое приложение.

cat / etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

Это моя конфигурация:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false
5 голосов
/ 11 марта 2014

Большое спасибо, работает так:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.port = 25000 -jar myjar .jar

1 голос
/ 18 сентября 2018

Я знаю, что эта ветка довольно старая, но есть дополнительная опция, которая очень поможет. Смотрите здесь: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/

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

0 голосов
/ 04 декабря 2017

Чтобы включить JMX remote, передайте ниже параметры VM вместе с командой JAVA.

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in
0 голосов
/ 11 мая 2012

У меня та же проблема, и я меняю любое имя хоста, которое совпадает с именем локального хоста, на 0.0.0.0, после этого оно работает.

...