Не удается подключиться к MBeanServer Tomcat через jconsole в Java6 - PullRequest
2 голосов
/ 13 апреля 2009

Я нахожусь на машине перспективы. Я запустил Tomcat 5.5.27 с этими опциями:

CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=9003 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false"

Когда я подключаюсь через jconsole и добавляю следующий сервисный URL

service:jmx:rmi:///jndi/rmi://localhost:9003/jmxrmi

это не будет подключаться. Есть идеи?

Ответы [ 5 ]

4 голосов
/ 11 августа 2011

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

Тем не менее, вот основы:

Для простого подключения через jconsole.

Если вы знаете , что JMX-сервер, к которому вы хотите подключиться, имеет порт реестра RMI на 9003, например, подключитесь с помощью

localhost:9003

вместо.

В противном случае вот что я обнаружил с нуля:

Предположим, у вас есть JMX-сервер (псевдоним «JMX-агент», псевдоним «JVM, к которому вы хотите подключиться»), работающий на «TARGET MACHINE» с портом реестра RMI в «RMI REGISTRY PORT» и порт сервера JMX RMI в «ПОРТ СЕРВЕРА JMX RMI».

Примечание:

  1. Реестр RMI сообщает клиентам JMX, где найти порт сервера RMI ; информацию можно получить по ключу jmxrmi.
  2. Порт реестра RMI общеизвестен, так как он задается через системные свойства при запуске JVM.
  3. Порт сервера RMI JMX обычно , а не , известный как JVM, выбирает его произвольно (если другие меры предосторожности не предпринимаются).

Следующий URI приведет к успеху (проверено)

service:jmx:rmi://<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

Это выглядит противно. Давайте разберемся с этим.

Этот URI является RFC2609 "URL-адрес протокола расположения службы" (ну, это действительно URI, верно?)

Он состоит из:

  • service - постоянная
  • jmx:rmi - тип услуги , состоящий из: абстрактный тип jmx и схема URL rmi
  • остальное - сок (спецификация протокола доступа к сервису)

сок разлагается на:

  • //<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT> - ipsite
  • /jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - часть URL

Хорошо информированный клиент JMX подключается к «ipsite» для обмена JMX-over-RMI; но что из клиента JMX, который не ЗНАЕТ тот порт? Patience ...

Часть URL раскладывается на:

  • /jndi/ - Похоже, это говорит клиенту JMX, что он может получить информацию о поиске в расположении, следующем за
  • rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Да, мы получаем информацию о сервере RMI JMX в реестре RMI под ключом поиска jmxrmi

Это что-то вроде "тележка перед лошадью", так как сначала нужно связаться с реестром RMI , заданным последним частью URL SLP.

Интуитивно почесав голову, попробуем:

service:jmx:rmi://<TARGET_MACHINE>/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

Да, это работает! Порт сервера JMX RMI хорошо получен из реестра. Если подумать, целевая машина также должна быть получена из реестра, таким образом:

service:jmx:rmi:///jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi

Еще лучше, это тоже работает!

Ссылки

1 download.oracle.com/javase/6/docs/api/javax/management/remote/rmi/package-summary.html
2 download.oracle.com/javase/6/docs/api/javax/management/remote/JMXServiceURL.html
3 mx4j.sourceforge.net/docs/ch03s04.html
4 download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdevg
5 http://www.rfc-editor.org/rfc/rfc2609.txt
4 голосов
/ 03 декабря 2010

В Ubuntu 10.04, используя OpenJDK 6 и Tomcat 6.0.29, я не смог активировать JMX для локального сеанса jconsole, независимо от того, сколько com.sun.management.jmxremote. * опций, которые я пропустил в Java с CATALINA_OPTS. Проблема была в параметре -Djava.io.tmpdir , который по умолчанию равен $ CATALINA_BASE / temp . Я просто должен был установить:

CATALINA_TMPDIR="/tmp"

в начале bin / catalina.sh , и я смог локально подключиться с помощью jconsole, jmap, jps и т. Д. Не было необходимости в com.sun.management.jmxremote. * настройки вообще.

1 голос
/ 14 апреля 2009

Работают ли процессы под одним и тем же пользователем?

Вы также можете проверить, запустив jps и jconsole (оба в каталоге JDK_HOME / bin)

0 голосов
/ 06 марта 2014

Я ответил на аналогичный вопрос здесь: java.rmi.ConnectException: соединение с хостом отказано: 127.0.1.1;

Я нашел много вопросов и ответов по этой теме, мне ничто не помогало - это потому, что моя проблема была более простой (что я могу сказать, я не сетевой гуру :)). Мой IP-адрес в / etc / hosts был неверным. То, что я пробовал, включало следующее для CATALINA_OPTS:

CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true -Xmx128M -server 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=7091 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=A.B.C.D"  #howeverI put the wrong ip here!

export CATALINA_OPTS

Моя проблема заключалась в том, что я изменил свой IP-адрес много месяцев назад, но никогда не обновлял свой файл / etc / hosts. кажется, что по умолчанию jconsole каким-то образом использует IP-адрес хоста -i, хотя я просматривал локальные процессы. Лучшим решением было просто изменить файл / etc / hosts.

Другое решение, которое может работать, - это получить правильный IP-адрес из / sbin / ifconfig и использовать этот IP-адрес при указании IP-адреса, например, в сценарии catalina.sh:

-Djava.rmi.server.hostname=A.B.C.D
0 голосов
/ 09 августа 2011

Это также необходимо для OS X 10.7 или Lion.

...