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:
Rejestru RMI mówi klientom JMX, gdzie znajduje się port serwera JMX RMI ; informacje można uzyskać pod kluczem jmxrmi.
Portu rejestru RMI jest ogólnie znane, jak to jest ustawione przez właściwości systemu podczas uruchamiania JVM.
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)
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://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).
/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.
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.
Odpowiedzi:
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:
jmxrmi
.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łajmx:rmi
- typ usługi złożony z: typu abstrakcyjnegojmx
i schematu URLrmi
sok rozkłada się na:
//<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>
- ipsite/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
- część adresu URLDobrze 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 lokalizacjirmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
- Tak, otrzymujemy informacje o JMX RMI Server w rejestrze RMI pod kluczem wyszukiwaniajmxrmi
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:
źródło
Wytłumaczyć:
service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
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)./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.
źródło
192.168.30.10:1234
w tym przykładzie)? tj. adresy URL zaczynające się odservice: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”).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:1234
aby powiązać port 1234 na wszystkich interfejsach. I tak dalej. Mam nadzieję że to pomoże.Według javax.management.remote.rmi
ten adres URL jest składany w ten sposób
service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
źródło