Объясните URL-адрес JMX

80

Я пытаюсь понять URL-адрес службы JMX.

service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi

Было бы здорово, если бы кто-нибудь помог мне в этом разобраться.

благодаря

Приянк
источник

Ответы:

106

Я повторно воспользуюсь ответом, который я написал ранее для этого вопроса: не удается подключиться к Tomcat MBeanServer через jconsole в Java6

Это не все, но может помочь:

Предположим, у вас есть сервер JMX (псевдоним «JMX Agent» псевдоним «JVM, к которому вы хотите подключиться»), запущенный на «ЦЕЛЕВОЙ МАШИНА» с портом реестра RMI в «RMI REGISTRY PORT» и портом сервера JMX RMI в «JMX RMI ПОРТ СЕРВЕРА'.

Заметка:

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

Следующий 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
  • остальное - sap (спецификация протокола доступа к сервису)

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

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

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

Часть URL разбивается на:

  • /jndi/ - Похоже, это сообщает JMX-клиенту, что он может получить поисковую информацию в следующем месте.
  • rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Да, мы получаем информацию о сервере JMX RMI в реестре 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. http://download.oracle.com/javase/6/docs/api/javax/management/remote/rmi/package-summary.html
  2. http://download.oracle.com/javase/6/docs/api/javax/management/remote/JMXServiceURL.html
  3. http://mx4j.sourceforge.net/docs/ch03s04.html
  4. http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdevg
  5. http://www.rfc-editor.org/rfc/rfc2609.txt
Дэвид Тонхофер
источник
7

Объяснять:

service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
  1. service:jmx:rmi://192.168.30.10:1234- говорит, что на машине с IP-адресом 192.168.30.10 установлен JMX Agent. Агент JMX использует (TCP) порт 1234 для предоставления услуг JMX через RMI (в основном действует как сервер RMI).
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi - говорит, что заглушка RMI для взаимодействия с агентом JMX через RMI может быть найдена в реестре RMI, который работает на машине с IP-адресом 192.168.30.10 и использует (TCP) порт 2344. Чтобы получить заглушку RMI, вам необходимо найдите привязку "jmxrmi".

Предыдущие ответы предполагают, что вторая часть URL-адреса предназначена для получения порта сервера JMX RMI-сервера. Это не так. Порт сервера JMX RMI - (TCP) 1234 и является частью URL-адреса. Из реестра RMI вы получаете заглушку RMI ( javax.management.remote.rmi.RMIServerImpl_Stub), которую можно использовать для связи с агентом JMX (сервер MBean) через RMI.

Надеюсь это поможет.

Пролансер
источник
Поскольку вы заявляете, что ответ @ david-tonhofer неверен, не могли бы вы объяснить, как работают URL-адреса без пары 1-й IP: порт ( 192.168.30.10:1234в этом примере)? то есть URL-адреса, которые начинаются с service:jmx:rmi:///jndi/rmi:. Одной из причин этого является настолько запутанной в целом в том , что , когда мы задаем JMX порт при запуске виртуальной машины Java, он не ссылается на RMI в любом месте: -Dcom.sun.management.jmxremote.port=2344. (Обратите внимание, что, по моему опыту, порт jmxremote связан с частью URL-адреса «Реестр RMI», а не с частью «Сервер JMX RMI».)
erik.weathers
Существует несколько способов указать IP-адрес и порт, которые будет использовать агент JMX. Если вы хотите привязать его к определенному IP и адресу, который вы можете использовать service:jmx:rmi://192.168.30.10:1234. В качестве альтернативы вы можете использовать com.sun.management.—свойства. Используйте URL-адрес, например, service:jmx:rmi:///…чтобы Java могла выбрать IP-адрес и порт за вас (случайным образом или на основе свойств системы). Используйте URL-адрес, например, service:jmx:rmi://0.0.0.0:1234для привязки порта 1234 ко всем интерфейсам. И так далее. Надеюсь это поможет.
Prolancer
4

Согласно javax.management.remote.rmi

этот URL собран так

service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
укладчик
источник
4
Я думаю, он спрашивает, почему это должно быть так сложно.
djangofan