Explicar la URL de JMX

80

Estoy tratando de entender la URL de un servicio JMX.

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

Sería genial si alguien pudiera ayudarme a entender esto.

Gracias

priyank
fuente

Respuestas:

106

Reutilizaré una respuesta que escribí anteriormente para esta pregunta: No se puede conectar al MBeanServer de Tomcat a través de jconsole en Java6

No está completo, pero podría ayudar:

Suponga que tiene el servidor JMX (alias 'JMX Agent' alias 'la JVM a la que desea conectarse') ejecutándose en 'TARGET MACHINE' con el puerto de registro RMI en 'RMI REGISTRY PORT' y el puerto del servidor JMX RMI en 'JMX RMI PUERTO DE SERVICIO'.

Nota:

  1. El registro RMI le dice a los clientes JMX dónde encontrar el puerto del servidor RMI JMX ; la información se puede obtener en clave jmxrmi.
  2. El puerto de registro RMI generalmente se conoce porque se establece a través de las propiedades del sistema al inicio de la JVM.
  3. El puerto del servidor JMX RMI generalmente no se conoce ya que la JVM lo elige al azar (si no se toman otras precauciones).

El siguiente URI conducirá a una conexión exitosa (probado)

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

Esto se ve desagradable. Vamos a cortarlo.

Este URI es un "URL de protocolo de ubicación de servicio" RFC2609 (bueno, es realmente un URI, ¿verdad?)

Está compuesto por:

  • service - una constante
  • jmx:rmi- el tipo de servicio compuesto por: tipo abstracto jmx y esquema de URL rmi
  • el resto - el sap (especificación del protocolo de acceso al servicio)

la savia se descompone en:

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

Un cliente JMX bien informado se conecta al "ipsite" para realizar intercambios JMX sobre RMI; pero ¿qué pasa con el cliente JMX que no CONOCE ese puerto? Paciencia...

La parte de la URL se descompone en:

  • /jndi/ - Esto parece decirle al cliente JMX que puede obtener información de búsqueda en la ubicación que sigue
  • rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi - Sí, obtenemos información sobre el servidor RMI JMX en el registro RMI, bajo la clave de búsqueda jmxrmi

Esto es algo complicado, ya que primero hay que ponerse en contacto con el registro RMI proporcionado por la última parte de la URL de SLP.

Después de rascarme la cabeza, intuitivamente, intentemos:

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

¡Sí, eso funciona! El puerto del servidor JMX RMI se obtiene fácilmente del registro. Pensándolo bien, la máquina de destino también debe obtenerse del registro, así:

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

Aún mejor, ¡eso también funciona!

Referencias:

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

Para explicar:

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- dice que hay un agente JMX en la máquina con la dirección IP 192.168.30.10. El agente JMX está utilizando el puerto (TCP) 1234 para proporcionar servicios JMX a través de RMI (básicamente actúa como un servidor RMI).
  2. /jndi/rmi://192.168.30.10:2344/jmxrmi - dice que el stub RMI para interactuar con el agente JMX sobre RMI se puede encontrar en el registro RMI que se está ejecutando en la máquina con la dirección IP 192.168.30.10 y está usando el puerto (TCP) 2344. Para obtener el stub RMI necesita busque el enlace "jmxrmi".

Las respuestas anteriores sugieren que la segunda parte de la URL es obtener el puerto del servidor del servidor JMX RMI. Eso no es correcto. El puerto del servidor JMX RMI es (TCP) 1234 y es parte de la URL. Lo que obtiene del registro RMI es el stub de RMI ( javax.management.remote.rmi.RMIServerImpl_Stub) que puede usar para hablar con el agente JMX (servidor MBean) a través de RMI.

Espero que esto ayude.

Prolancer
fuente
Dado que está afirmando que la respuesta de @ david-tonhofer no es correcta, ¿puede explicar cómo funcionan las URL sin la primera IP: par de puertos ( 192.168.30.10:1234en este ejemplo)? es decir, las URL que comienzan conservice:jmx:rmi:///jndi/rmi: . Parte de la razón de que esto es tan confuso, en general, es que cuando se especifica un puerto JMX al iniciar la JVM, no Referencia RMI en cualquier lugar: -Dcom.sun.management.jmxremote.port=2344. (Tenga en cuenta que, en mi experiencia, el puerto jmxremote está asociado con la parte "Registro RMI" de la URL, no con la parte "Servidor RMI JMX").
erik.weathers
Hay varias formas de especificar la IP y el puerto que utilizará el agente JMX. Si desea arreglarlo a una IP y dirección específicas, puede usar service:jmx:rmi://192.168.30.10:1234. Alternativamente, puede utilizar com.sun.management.—propiedades. Utilice una URL comoservice:jmx:rmi:///… para permitir que Java elija la IP y el puerto por usted (al azar o según las propiedades del sistema). Utilice una URL como service:jmx:rmi://0.0.0.0:1234para vincular el puerto 1234 en todas las interfaces. Y así. Espero que esto ayude.
Prolancer
4

Según javax.management.remote.rmi

esta URL se ensambla así

service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname
apilador
fuente
4
Creo que se pregunta por qué tiene que ser tan complejo.
djangofan