Поясніть URL-адресу JMX


80

Я намагаюся зрозуміти URL-адресу служби JMX.

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

Було б чудово, якби хтось допоміг мені це зрозуміти.

Дякую


Відноситься до stackoverflow.com/questions/743343/…
Грей

Відповіді:


106

Я повторно використаю відповідь, яку я написав раніше на це запитання: Не вдається підключитися до MBeanServer Tomcat через jconsole в Java6

Це не повністю, але може допомогти:

Припустимо, у вас є сервер JMX (псевдонім 'JMX Agent' псевдонім 'JVM, до якого ви хочете підключитися'), який працює на 'TARGET MACHINE' з портом реєстру 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> - ipsite
  • /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- говорить, що на машині є агент JMX з IP-адресою 192.168.30.10. Агент 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".

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

Сподіваюся, це допомагає.


Оскільки ви заявляєте, що відповідь @ david-tonhofer є неправильною, чи можете ви пояснити, як функціонують URL-адреси без першої пари 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.