Удаленное соединение JMX

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

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

  • com.солнце.управление.jmxremote
  • com.солнце.управление.jmxremote.port=1088
  • com.солнце.управление.jmxremote.authenticate=false
  • com.солнце.управление.jmxremote.протокол SSL=ложь

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

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

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

11 ответов


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

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

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

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

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

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

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 возвращает.

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


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

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

см. Также почему Java открывает 3 порта, когда JMX настроен?


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

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

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

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


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

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

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

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 или без него.РМО.сервер.системное свойство hostname, у меня есть следующие привязки:

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

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

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

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


большое спасибо, он работает следующим образом:

java -Джава.РМО.сервер.имя=ХХХ.ХХХ.ХХХ.ХХХ -Dcom.солнце.управление.jmxremote -модель DCOM.солнце.управление.jmxremote.ssl=false-Dcom.солнце.управление.jmxremote.authenticate=false-Dcom.солнце.управление.jmxremote.port=25000-jar myjar.Джар


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

кошка /и т. д./хосты

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

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


чтобы включить 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

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

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


попробуйте использовать порты выше 3000.