Wyjaśnij adres URL JMX

80

Próbuję zrozumieć adres URL usługi JMX.

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

Byłoby wspaniale, gdyby ktoś mógł mi pomóc to zrozumieć.

Dzięki

priyank
źródło

Odpowiedzi:

106

Ponownie wykorzystam odpowiedź, którą napisałem wcześniej na to pytanie: Nie można połączyć się z serwerem MBeanServer Tomcata przez jconsole w Javie6

Nie jest kompletna, ale może pomóc:

Załóżmy, że masz serwer JMX (alias 'Agent JMX' alias 'JVM, z którym chcesz się połączyć') działający na 'MASZYNIE DOCELOWEJ' z portem rejestru RMI w 'PORT REJESTRACYJNY RMI ' i portem serwera JMX RMI w 'JMX RMI PORT SERWERA'.

Uwaga:

  1. Rejestru RMI mówi klientom JMX, gdzie znajduje się port serwera JMX RMI ; informacje można uzyskać pod kluczem jmxrmi.
  2. Portu rejestru RMI jest ogólnie znane, jak to jest ustawione przez właściwości systemu podczas uruchamiania JVM.
  3. Port serwera JMX RMI jest zazwyczaj nie wiadomo jak JVM wybiera je losowo (jeśli nie zostaną podjęte inne środki ostrożności).

Poniższy identyfikator URI doprowadzi do pomyślnego połączenia (przetestowane)

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

To wygląda paskudnie. Odetnijmy to.

Ten identyfikator URI to adres URL protokołu lokalizacji usługi RFC2609 (cóż, to naprawdę identyfikator URI, prawda?)

Jest to złożone z:

  • service - stała
  • jmx:rmi- typ usługi złożony z: typu abstrakcyjnego jmx i schematu URL rmi
  • reszta - sap (specyfikacja protokołu dostępu do usługi)

sok rozkłada się na:

  • //<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT> - ipsite
  • /jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - część adresu URL

Dobrze poinformowany klient JMX łączy się z „ipsite” w celu wymiany JMX-over-RMI; ale co z klientem JMX, który nie ZNA tego portu? Cierpliwość...

Część adresu URL jest dekomponowana na:

  • /jndi/ - Wydaje się, że mówi to klientowi JMX, że może uzyskać informacje wyszukiwania w następującej lokalizacji
  • rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Tak, otrzymujemy informacje o JMX RMI Server w rejestrze RMI pod kluczem wyszukiwania jmxrmi

To jest coś w rodzaju wózka przed koniem, ponieważ najpierw należy skontaktować się z rejestrem RMI podanym w drugiej części adresu URL SLP.

Po drapaniu głowy intuicyjnie spróbujmy:

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

Tak, to działa! Port serwera JMX RMI jest ładnie uzyskany z rejestru. Po zastanowieniu komputer docelowy powinien również zostać uzyskany z rejestru, a zatem:

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

Nawet lepiej, to też działa!

Bibliografia:

  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
David Tonhofer
źródło
7

Wytłumaczyć:

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- mówi, że na maszynie jest agent JMX o adresie IP 192.168.30.10. Agent JMX używa portu (TCP) 1234 do świadczenia usług JMX przez RMI (działa w zasadzie jako serwer RMI).
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi - mówi, że kod RMI do interakcji z agentem JMX przez RMI można znaleźć w rejestrze RMI, który działa na komputerze z adresem IP 192.168.30.10 i korzysta z portu (TCP) 2344. Aby uzyskać kod pośredniczący RMI, musisz wyszukaj powiązanie "jmxrmi".

Poprzednie odpowiedzi sugerują, że druga część adresu URL służy do uzyskania portu serwera serwera JMX RMI. To nie jest poprawne. Port serwera JMX RMI to (TCP) 1234 i jest częścią adresu URL. To, co otrzymujesz z rejestru RMI, to funkcja RMI stub ( javax.management.remote.rmi.RMIServerImpl_Stub), której możesz użyć do komunikacji z agentem JMX (serwerem MBean) przez RMI.

Mam nadzieję że to pomoże.

Prolancer
źródło
Ponieważ twierdzisz, że odpowiedź @ david-tonhofer jest nieprawidłowa, czy możesz wyjaśnić, jak działają adresy URL bez pierwszej pary IP: port ( 192.168.30.10:1234w tym przykładzie)? tj. adresy URL zaczynające się od service:jmx:rmi:///jndi/rmi:. Jednym z powodów jest to tak skomplikowane w ogóle jest, że kiedy określenie portu JMX podczas uruchamiania JVM, nie odwoływać RMI wszędzie: -Dcom.sun.management.jmxremote.port=2344. (Zauważ, że z mojego doświadczenia wynika, że ​​port jmxremote jest powiązany z częścią „RMI Registry” adresu URL, a nie z częścią „JMX RMI Server”).
erik.weathers
Istnieje wiele sposobów określenia adresu IP i portu, których będzie używać agent JMX. Jeśli chcesz to naprawić na określony adres IP i adres, możesz użyć service:jmx:rmi://192.168.30.10:1234. Alternatywnie możesz użyć com.sun.management.—właściwości. Użyj adresu URL, service:jmx:rmi:///…aby pozwolić Javie wybrać dla Ciebie adres IP i port (losowo lub na podstawie właściwości systemu). Użyj adresu URL, na przykład, service:jmx:rmi://0.0.0.0:1234aby powiązać port 1234 na wszystkich interfejsach. I tak dalej. Mam nadzieję że to pomoże.
Prolancer
4

Według javax.management.remote.rmi

ten adres URL jest składany w ten sposób

service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
sztaplarka
źródło
4
Myślę, że pyta, dlaczego to musi być tak złożone.
djangofan