Кажется, у меня никогда не было этого, чтобы работать раньше. В настоящее время Я ЗНАЮ, что это не работает.
Но мы запускаем наш Java-процесс:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=6002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Я могу подключиться к порту через telnet, и «что-то есть» (то есть, если я не запустил процесс, ничего не ответит, но если я это сделаю, то да), но я не могу заставить JConsole работать, заполняя IP и порт.
Вроде бы все должно быть так просто, но без ошибок, без шума, ничего. Просто не работает.
Кто-нибудь знает полезный совет по этому поводу?
Ответы:
У меня есть решение для этого:
Если ваш процесс Java выполняется в Linux за брандмауэром, и вы хотите запустить JConsole / Java VisualVM / Java Mission Control в Windows на локальном компьютере, чтобы подключить его к порту JMX вашего процесса Java .
Вам нужен доступ к вашей Linux-машине через SSH-вход. Все коммуникации будут туннелироваться через соединение SSH.
СОВЕТ: Это решение работает независимо от того, есть брандмауэр или нет.
Недостаток: каждый раз, когда вы перезапускаете свой Java-процесс, вам нужно будет снова выполнять все шаги с 4 по 9.
1. Вам понадобится набор шпатлевок для вашей машины с Windows отсюда:
2. Определите один свободный порт на вашем компьютере с Linux:
Пример:
3. Добавьте аргументы в java-процесс на Linux-машине.
Делать это нужно именно так. Если это сделано, как показано ниже, это работает для машин Linux за брандмауэрами (это работает по причине
-Djava.rmi.server.hostname=localhost
аргумента).Пример:
4. Получите идентификатор процесса Java.
Пример:
5. Найдите произвольный порт для загрузки заглушек RMIServer.
Java-процесс открывает новый TCP-порт на Linux-машине, где RMI Server-Stubs будут доступны для загрузки. Этот порт также должен быть доступен через туннель SSH для подключения к виртуальной машине Java.
С
netstat -lp
этим портом также можно найтиlsof -i
подсказки, какой порт был открыт из java-процесса.ПРИМЕЧАНИЕ. Этот порт всегда изменяется при запуске Java-процесса.
Пример:
6. Включите два SSH-туннеля на вашем компьютере с Windows с помощью putty.
Пример:
7. Войдите в свою Linux-машину с помощью Putty с включенным SSH-туннелем.
Оставьте шпатлевку открытой.
Когда вы вошли в систему, Putty будет туннелировать все TCP-соединения с Linux-машиной через SSH-порт 22.
JMX-порт:
RMIServer-Сто-порт:
8. Запустите JConsole / Java VisualVM / Java Mission Control, чтобы подключиться к вашему Java-процессу, используя следующий URL-адрес.
Это работает, потому что JConsole / Java VisualVM / Java Mission Control думает, что вы подключаетесь к порту на локальной машине Windows. но Putty отправляет всю полезную нагрузку на порт 15666 на вашу Linux-машину.
На Linux-машине сначала процесс java дает ответ и отправляет обратно порт RMIServer. В этом примере 37123.
Затем JConsole / Java VisualVM / Java Mission Control считает, что он подключается к localhost: 37123, и putty отправит всю полезную нагрузку на Linux-машину.
Процесс java отвечает, и соединение открыто.
Пример:
9. НАСЛАЖДАЙТЕСЬ № 8-]
источник
Добавление
-Djava.rmi.server.hostname='<host ip>'
решило эту проблему для меня.источник
Пробовал с Java 8 и более новыми версиями
Это решение хорошо работает также с межсетевыми экранами.
1. Добавьте это в свой сценарий запуска java на удаленном хосте:
2. Выполните это на своем компьютере.
Пользователи Windows :
putty.exe -ssh user@remote-host -L 1616:remote-host:1616
Пользователи Linux и Mac :
ssh user@remote-host -L 1616:remote-host:1616
3. Запустите
jconsole
на своем компьютере.4. Удачи!
PS: на шаге 2 с помощью
ssh
и-L
вы указываете, что порт 1616 на локальном (клиентском) хосте должен быть перенаправлен на удаленную сторону. Это туннель ssh, который помогает избежать проблем с брандмауэрами или различными сетевыми проблемами.источник
Вероятно, у вас проблема с брандмауэром. «Проблема» в том, что указанный вами порт - не единственный используемый порт, он использует еще 1 или, может быть, 2 порта для RMI, и они, вероятно, заблокированы брандмауэром.
Один из дополнительных портов не будет известен заранее, если вы используете конфигурацию RMI по умолчанию, поэтому вам придется открыть большой диапазон портов, что может не позабавить администратора сервера.
Существует решение, которое не требует открытия большого количества портов, однако я заставил его работать, используя объединенные исходные фрагменты и советы от
http://forums.sun.com/thread.jspa?threadID=5267091- ссылка больше не работаетhttp://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Можно даже настроить ssh-туннель и заставить его работать :-)
источник
forums.sun.com
работаетblogs.oracle.com
работает.После тестирования моего Google-fu в течение последних нескольких дней я наконец смог заставить это работать после компиляции ответов из Stack Overflow и этой страницы http://help.boomi.com/atomsphere/GUID-F787998C- 53C8-4662-AA06-8B1D32F9D55B.html .
Репост со страницы Dell Boomi:
Единственная строка, которую я не видел ни одной обложки ответа на переполнение стека, - это
В моем случае я пытался получить показатели Kakfa, поэтому я просто изменил вышеуказанный параметр, чтобы он соответствовал
-Dcom.sun.management.jmxremote.port
значению. Итак, без какой-либо аутентификации минимальная конфигурация должна выглядеть так:источник
Вы работаете в Linux? Возможно, агент управления привязан к localhost:
http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1
источник
Шаги 4-7 Сушикутты можно пропустить, добавив к шагу 3 следующую строку:
например, Добавить к параметрам запуска:
Для переадресации портов подключитесь, используя:
если ваш хост является ступенькой, просто подключите порт вперед, выполнив следующую команду на ступеньке после указанной выше:
Помните, что hostname = localhost необходимо, чтобы убедиться, что jmxremote сообщает rmi-соединению использовать туннель. В противном случае он может попытаться подключиться напрямую и попасть в брандмауэр.
источник
ssh -L <JMX_port>:localhost:<JMX_port> <remote_user>@<remote_host>
на локальном компьютере (3) Затем я подключаюсь к удаленному JMX, используя:jconsole <remote_host>:<JMX_port>
PROTIP:
Порт RMI открывается на произвольном порте. Если у вас есть брандмауэр и вы не хотите открывать порты 1024-65535 (или использовать vpn), вам необходимо сделать следующее.
Вам необходимо исправить (как при наличии известного номера) порты реестра RMI и JMX / RMI Server. Вы делаете это, помещая jar-файл (catalina-jmx-remote.jar в дополнительный) в lib-dir и настраивая специальный слушатель на сервере:
(И, конечно же, обычные флаги для активации JMX
См .: Удаленный прослушиватель жизненного цикла JMX на http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html
Затем вы можете подключиться, используя этот ужасный URL:
источник
Убедитесь, что ваш сервер находится за брандмауэром. JMX основан на RMI, который при запуске открывает два порта. Один из них - порт регистра, по умолчанию - 1099, и его можно указать в
com.sun.management.jmxremote.port
опции. Другой - для передачи данных и является случайным, что и является причиной проблемы. Хорошей новостью является то, что в JDK6 этот случайный порт можно указать с помощьюcom.sun.management.jmxremote.rmi.port
опции.источник
Получить JMX через брандмауэр действительно сложно. Проблема в том, что стандартный RMI использует второй случайно назначенный порт (рядом с реестром RMI).
У нас есть три эффективных решения, но для каждого случая нужно другое:
JMX через SSH-туннель с прокси-сервером Socks, использует стандартный RMI с магией SSH http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html
JMX MP (альтернатива стандартному RMI), использует только один фиксированный порт, но требует специального jar на сервере и клиенте http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/
Запустите код формы JMX Server, там можно использовать стандартный RMI и использовать фиксированный второй порт: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055
источник
При тестировании / отладке / диагностике удаленных проблем JMX сначала всегда пытайтесь подключиться к тому же хосту, который содержит MBeanServer (то есть localhost), чтобы исключить сетевые и другие проблемы, не связанные с JMX.
источник
Здесь уже есть несколько отличных ответов, но есть несколько более простой подход, которым, я думаю, стоит поделиться.
Подход sushicutta хорош, но очень ручной, поскольку вам нужно каждый раз получать порт RMI. К счастью, мы можем обойти это, используя прокси-сервер SOCKS вместо того, чтобы явно открывать туннели портов. Обратной стороной этого подхода является то, что приложение JMX, которое вы запускаете на своем компьютере, должно быть настроено для использования прокси. Большинство процессов вы можете сделать это, добавив свойства java, но некоторые приложения не поддерживают это.
шаги:
Добавьте параметры JMX в сценарий запуска для удаленной службы Java:
Настройте прокси-соединение SOCKS с удаленным компьютером:
Настройте локальное приложение для мониторинга Java на использование прокси-сервера SOCKS (localhost: 9696). Примечание. Иногда это можно сделать из командной строки, например:
источник
У меня сработало следующее (хотя я думаю, что порт 2101 на самом деле этому не способствовал):
Я подключаюсь с удаленного компьютера к серверу, на котором работает Docker, а процесс находится внутри контейнера. Кроме того, я остановил firewallD, но я не думаю, что это была проблема, поскольку я мог подключиться к 2100 даже при открытом брандмауэре. Надеюсь, поможет.
источник
Я запускаю JConsole / JVisualVm на подключении Windows к tomcat под управлением Linux Redhat ES3.
Отключение фильтрации пакетов с помощью следующей команды помогло мне:
где jconsole-host - это либо имя хоста, либо адрес хоста, на котором работает JConsole, а jmxremote-port - это номер порта, установленный для com.sun.management.jmxremote.port для удаленного управления.
источник
Я использую boot2docker для запуска контейнеров докеров с Tomcat внутри, и у меня такая же проблема, решение заключалось в следующем:
-Djava.rmi.server.hostname=192.168.59.103
docker run ... -p 9999:9999 ...
. Использование разных портов не работает.источник
Вам также необходимо убедиться, что имя вашего компьютера соответствует IP-адресу, к которому привязан JMX; НЕ localhost и не 127.0.0.1. Для меня это помогло добавить запись в хосты, которая явно определяет это.
источник
Получить JMX через брандмауэр совсем не сложно. Есть одна маленькая загвоздка. Вы должны перенаправить оба настроенного порта JMX, т.е. 9010 и один из динамических портов, который он прослушивает на моей машине, был> 30000
источник
Вот шаги, которые сработали для меня (debian за брандмауэром на стороне сервера, доступ через VPN с моего локального Mac):
проверьте ip сервера
используйте параметры JVM:
запустить приложение
найти pid запущенного java-процесса
проверьте все порты, используемые JMX / RMI
откройте все порты с шага 5 на брандмауэре
Вуаля.
источник
Чтобы внести свой вклад, это то, что я сделал в CentOS 6.4 для Tomcat 6.
Завершение работы службы iptables
Добавьте следующую строку в tomcat6.conf
Таким образом, я смог подключиться с другого ПК с помощью JConsole.
источник
Я пытаюсь JMC запустить Flight Recorder (JFR) для профилирования NiFi на удаленном сервере, который не предлагает графическую среду для запуска JMC.
Основываясь на других ответах, приведенных здесь, и после многих проб и ошибок, вот что я предоставляю JVM ( conf / bootstrap.conf ) при запуске NiFi:
Я положил это в / etc / hosts , хотя сомневаюсь, что это нужно:
Затем, после запуска JMC, я создаю удаленное соединение со следующими свойствами:
Кстати, если я щелкну URL-адрес пользовательской службы JMX, я вижу:
Это наконец сделало это за меня.
источник