Я пытаюсь открыть JMX-соединение с Java-приложением, запущенным на удаленном компьютере.
В JVM приложения настроены следующие параметры:
- com.sun.management.jmxremote
- com.sun.management.jmxremote.port = 1088
- com.sun.management.jmxremote.authenticate = false
- com.sun.management.jmxremote.ssl = false
Я могу подключиться с localhost:1088
помощью jconsole или jvisualvm. Но я не могу подключиться с xxx.xxx.xxx.xxx:1088
удаленного компьютера.
Между серверами и ОС нет брандмауэра. Но чтобы исключить эту возможность, я telnet xxx.xxx.xxx.xxx 1088
и я думаю, что он подключается, так как экран консоли гаснет.
Оба сервера - Windows Server 2008 x64. Пробовал с 64-битной JVM и 32-битной, ничего не работает.
Ответы:
Если бы это было в Linux, проблема заключалась бы в том, что localhost является интерфейсом обратной связи , вам нужно, чтобы приложение было привязано к вашему сетевому интерфейсу .
Вы можете использовать netstat, чтобы подтвердить, что он не привязан к ожидаемому сетевому интерфейсу.
Вы можете выполнить эту работу, вызвав программу с системным параметром
java.rmi.server.hostname="YOUR_IP"
, либо как переменную среды, либо используяисточник
hostname -i
, подробнее см. Stackoverflow.com/a/11654322/99834 .Я потратил больше дня, пытаясь заставить JMX работать за пределами localhost. Похоже, что SUN / Oracle не смогли предоставить хорошую документацию по этому поводу.
Убедитесь, что следующая команда вернет вам реальный IP-адрес или HOSTNAME. Если он вернет что-то вроде 127.0.0.1, 127.0.1.1 или localhost, он не будет работать, и вам придется обновить
/etc/hosts
файл.Вот команда, необходимая для включения JMX даже извне
Где, как вы предполагали, myserver.example.com должен соответствовать тому, что
hostname -i
возвращает.Очевидно, вам нужно быть уверенным, что брандмауэр вас не блокирует, но я почти уверен, что это не ваша проблема, проблема заключается в последнем параметре, который не задокументирован.
источник
java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>
. Надеюсь, это кому-то поможет.В моем тестировании с Tomcat и Java 8 JVM открывала эфемерный порт в дополнение к тому, который указан для JMX. Следующий код исправил меня; попробуйте, если у вас возникли проблемы, когда ваш клиент JMX (например, VisualVM не подключается.
Также см. Почему Java открывает 3 порта при настройке JMX?
источник
http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole
Если вы пытаетесь получить доступ к серверу, который находится за NAT, вам, скорее всего, придется запустить свой сервер с опцией
так что заглушки RMI, отправляемые клиенту, содержат общедоступный адрес сервера, позволяющий клиентам получить к нему доступ извне.
источник
похоже, что ваша финальная цитата приходит слишком рано. Он должен быть после последнего параметра.
У меня этот трюк сработал.
Я заметил кое-что интересное: когда я запускаю свое приложение, используя следующую командную строку:
Если я попытаюсь подключиться к этому порту с удаленного компьютера с помощью jconsole, TCP-соединение будет успешным, некоторые данные будут обмениваться между удаленной jconsole и локальным jmx-агентом, где развернут мой MBean, а затем jconsole отобразит сообщение об ошибке подключения. Я выполнил захват Wirehark, и он показывает, что обмен данными происходит как от агента, так и от jconsole.
Таким образом, это не проблема сети, если я выполняю netstat -an с системным свойством java.rmi.server.hostname или без него, у меня будут следующие привязки:
Это означает, что в обоих случаях сокет, созданный на порту 9999, принимает соединения с любого хоста по любому адресу.
Я думаю, что содержимое этого системного свойства используется где-то при подключении и сравнивается с фактическим IP-адресом, используемым агентом для связи с jconsole. И если эти адреса не совпадают, соединение не устанавливается.
У меня не было этой проблемы при подключении с того же хоста с помощью jconsole, только с реальных физических удаленных хостов. Итак, я предполагаю, что эта проверка выполняется только тогда, когда соединение идет "извне".
источник
у меня сработало то, что я установил / etc / hosts, чтобы указать имя хоста на ip, а не на интерфейс обратной связи, а затем перезапустить мое приложение.
кошка / etc / hosts
Это моя конфигурация:
источник
Большое спасибо, это работает так:
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
источник
Я знаю, что эта ветка довольно старая, но есть дополнительная опция, которая очень поможет. Смотрите здесь: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/
-Dcom.sun.management.jmxremote.rmi.port=1099
источник
У меня такая же проблема, и я меняю любое имя хоста, которое соответствует имени локального хоста, на 0.0.0.0, после этого оно, похоже, работает.
источник
Чтобы включить удаленный JMX, передайте параметры виртуальной машины вместе с командой JAVA.
источник
Попробуйте это, я тестировал доступ к JMX внутри контейнера докеров
затем
Локальный хост $ jconsole: 16000
источник
Попробуйте использовать порты выше 3000.
источник