web-dev-qa-db-fra.com

Expliquez l'URL JMX

J'essaie de comprendre une URL de service JMX.

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

Ce serait formidable si quelqu'un pouvait m'aider à comprendre cela.

Merci

66
priyank

Je vais réutiliser une réponse que j'ai écrite plus tôt pour cette question: Impossible de se connecter au MBeanServer de Tomcat via jconsole en Java6

Ce n'est pas complet, mais pourrait aider:

Supposons que le serveur JMX (alias 'Agent JMX' alias 'la machine virtuelle Java à laquelle vous souhaitez vous connecter') s'exécute sur 'TARGET MACHINE' avec le port de registre RMI sur 'RMI REGISTRY PORT' et le port du serveur JMX RMI sur 'JMX RMI SERVER PORT'.

Remarque:

  1. Le registre RMI indique aux clients JMX où trouver le port du serveur JMX RMI; les informations peuvent être obtenues sous la clé jmxrmi.
  2. Le port de registre RMI est généralement connu car il est défini via les propriétés système au démarrage de la machine virtuelle Java.
  3. Le port du serveur JMX RMI est généralement pas connu comme la JVM le choisit au hasard (si aucune autre précaution n'est prise ).

L'URI suivant conduira à une connexion réussie (testé)

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

Cela a l'air méchant. Découpons-le.

Cet URI est une "URL de protocole d'emplacement de service" RFC2609 (enfin, c'est vraiment un URI, non?)

Cela est composé de:

  • service - une constante
  • jmx:rmi - le type de service composé de: type abstraitjmx et schéma d'URLrmi
  • le reste - le sap (spécification du protocole d'accès au service)

sap est décomposé en:

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

Un client JMX bien informé se connecte à "ipsite" pour effectuer des échanges JMX sur RMI; mais qu'en est-il du client JMX qui ne CONNAIT PAS ce port? La patience...

partie URL est décomposé en:

  • /jndi/ - Cela semble indiquer au client JMX qu'il peut obtenir des informations de recherche à l'emplacement qui suit
  • rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Oui, nous obtenons des informations sur le serveur JMX RMI dans le registre RMI, sous la clé de recherche jmxrmi

C'est un peu un chariot avant cheval, car il faut contacter le Registre RMI donné par la dernière partie de l'URL SLP en premier.

Après avoir gratté la tête, intuitivement, essayons:

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

Oui ça marche! Le port du serveur JMX RMI est joliment obtenu à partir du registre. À la réflexion, la machine cible devrait également être obtenue du registre, ainsi:

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

Encore mieux, ça marche aussi!

Les références:

  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
96
David Tonhofer

Expliquer:

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 - indique qu'il existe un agent JMX sur la machine avec l'adresse IP 192.168.30.10. L'agent JMX utilise le port (TCP) 1234 pour fournir des services JMX sur RMI (agit essentiellement comme un serveur RMI).
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi - indique que le stub RMI pour interagir avec l'agent JMX via RMI se trouve dans le registre RMI qui s'exécute sur la machine avec l'adresse IP 192.168.30.10 et utilise le port (TCP) 2344. Pour obtenir le stub RMI, vous besoin de rechercher la liaison "jmxrmi".

Les réponses précédentes suggèrent que la 2ème partie de l'URL consiste à obtenir le port serveur du serveur JMX RMI. Ce n'est pas correct. Le port du serveur JMX RMI est (TCP) 1234 et fait partie de l'URL. Ce que vous obtenez du registre RMI est le stub RMI (javax.management.remote.rmi.RMIServerImpl_Stub) que vous pouvez utiliser pour parler à l'agent JMX (serveur MBean) via RMI.

J'espère que cela t'aides.

5
Prolancer

Selon javax.management.remote.rmi

cette URL est assemblée comme ça

service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
4
stacker