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
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:
jmxrmi
.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 constantejmx:rmi
- le type de service composé de: type abstraitjmx
et schéma d'URLrmi
sap est décomposé en:
//<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>
- ipsite/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
- partie URLUn 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 suitrmi://<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:
Expliquer:
service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
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)./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.
Selon javax.management.remote.rmi
cette URL est assemblée comme ça
service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname