Erläutern Sie die JMX-URL

80

Ich versuche, eine JMX-Dienst-URL zu verstehen.

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

Es wäre toll, wenn mir jemand helfen könnte, das zu verstehen.

Vielen Dank

Priyank
quelle

Antworten:

105

Ich werde eine Antwort, die ich zuvor für diese Frage geschrieben habe, wiederverwenden: Es kann keine Verbindung zu Tomcats MBeanServer über jconsole in Java6 hergestellt werden

Es ist nicht vollständig, könnte aber helfen:

Angenommen, Sie haben den JMX-Server (Alias ​​'JMX Agent' Alias ​​'die JVM, zu der Sie eine Verbindung herstellen möchten') auf 'TARGET MACHINE' mit dem RMI-Registrierungsport unter 'RMI REGISTRY PORT' und dem JMX RMI- Serverport unter ' JMX RMI ' ausgeführt SERVER PORT'.

Hinweis:

  1. Die RMI-Registrierung teilt JMX-Clients mit, wo sich der JMX-RMI-Serverport befindet . Informationen erhalten Sie unter Schlüssel jmxrmi.
  2. Der RMI-Registrierungsport ist allgemein bekannt, da er beim JVM-Start über die Systemeigenschaften festgelegt wird.
  3. Der JMX-RMI-Server-Port ist im Allgemeinen nicht bekannt, da die JVM ihn zufällig auswählt (sofern keine anderen Vorsichtsmaßnahmen getroffen werden).

Der folgende URI führt zu einer erfolgreichen Verbindung (getestet)

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

Das sieht böse aus. Lass es uns auseinander schneiden.

Diese URI ist eine RFC2609 "Service Location Protocol URL" (nun, es ist wirklich eine URI, oder?)

Es besteht aus:

  • service - eine Konstante
  • jmx:rmi- Der Diensttyp, bestehend aus: abstraktem Typ jmx und URL-Schema rmi
  • der Rest - der SAP (Service Access Protocol Specification)

Saft wird zerlegt in:

  • //<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT> - ipsite
  • /jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - URL-Teil

Ein gut informierter JMX-Client stellt eine Verbindung zur "ipsite" her, um JMX-over-RMI-Austausche durchzuführen. Aber was ist mit dem JMX-Client, der diesen Port nicht kennt? Die Geduld...

Der URL-Teil wird zerlegt in:

  • /jndi/ - Dies scheint dem JMX-Client mitzuteilen, dass er am folgenden Speicherort Suchinformationen abrufen kann
  • rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Ja, wir erhalten Informationen über den JMX-RMI-Server in der RMI-Registrierung unter dem Suchschlüssel jmxrmi

Dies ist etwas Cart-before-Horse, da man sich zuerst an die RMI-Registrierung wenden muss, die im letzten Teil der SLP-URL angegeben ist.

Nachdem wir uns intuitiv am Kopf gekratzt haben, versuchen wir Folgendes:

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

Ja das funktioniert Der JMX RMI-Server-Port wird gut von der Registrierung bezogen. Bei zweiten Überlegungen sollte der Zielcomputer auch aus der Registrierung bezogen werden, also:

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

Noch besser, das funktioniert auch!

Verweise:

  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
quelle
7

Erklären:

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- sagt, dass sich auf dem Computer ein JMX-Agent mit der IP-Adresse 192.168.30.10 befindet. Der JMX-Agent verwendet (TCP) -Port 1234, um JMX-Dienste über RMI bereitzustellen (fungiert im Wesentlichen als RMI-Server).
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi - sagt, dass sich der RMI-Stub für die Interaktion mit dem JMX-Agenten über RMI in der RMI-Registrierung befindet, die auf dem Computer mit der IP-Adresse 192.168.30.10 ausgeführt wird und den (TCP-) Port 2344 verwendet. Um den RMI-Stub abzurufen, müssen Sie Suchen Sie nach der Bindung "jmxrmi".

Frühere Antworten deuten darauf hin, dass der zweite Teil der URL darin besteht, den Server-Port des JMX RMI-Servers abzurufen. Das ist nicht richtig. Der JMX-RMI-Serverport ist (TCP) 1234 und Teil der URL. Was Sie von der RMI-Registrierung erhalten, ist der RMI-Stub ( javax.management.remote.rmi.RMIServerImpl_Stub), mit dem Sie über RMI mit dem JMX-Agenten (MBean Server) kommunizieren können.

Hoffe das hilft.

Prolancer
quelle
Können Sie bitte erklären, wie die URLs ohne das 1. IP: Port-Paar ( 192.168.30.10:1234in diesem Beispiel) funktionieren, da Sie angeben, dass die Antwort von @ david-tonhofer nicht korrekt ist ? dh die URLs, die mit beginnen service:jmx:rmi:///jndi/rmi:. Ein Grund dafür, dass dies im Allgemeinen so verwirrend ist, ist, dass wenn wir beim Starten der JVM einen jmx-Port angeben, dieser nirgendwo auf RMI verweist : -Dcom.sun.management.jmxremote.port=2344. (Beachten Sie, dass meiner Erfahrung nach der jmxremote-Port dem Teil "RMI Registry" der URL zugeordnet ist, nicht dem Teil "JMX RMI Server".)
erik.weathers
Es gibt verschiedene Möglichkeiten, die IP und den Port anzugeben, die der JMX-Agent verwenden wird. Wenn Sie es auf eine bestimmte IP und Adresse festlegen möchten, können Sie verwenden service:jmx:rmi://192.168.30.10:1234. Alternativ können Sie com.sun.management.—Eigenschaften verwenden. Verwenden Sie eine URL service:jmx:rmi:///…, damit Java die IP und den Port für Sie auswählt (zufällig oder basierend auf Systemeigenschaften). Verwenden Sie eine URL service:jmx:rmi://0.0.0.0:1234, um Port 1234 an alle Schnittstellen zu binden. Und so weiter. Hoffe das hilft.
Prolancer
4

Laut javax.management.remote.rmi

Diese URL wird so zusammengestellt

service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
Stapler
quelle
4
Ich denke, er fragt, warum es so komplex sein muss.
Djangofan