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
Respuestas:
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:
jmxrmi
.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
la savia se descompone en:
//<TARGET_MACHINE>:<JMX_RMI_SERVER_PORT>
- ipsite/jndi/rmi://<TARGET_MACHINE>:<RMI_REGISTRY_PORT>/jmxrmi
- parte URLUn 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 siguermi://<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:
Para explicar:
service:jmx:rmi://192.168.30.10:1234/jndi/rmi://192.168.30.10:2344/jmxrmi
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)./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.
192.168.30.10:1234
en 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").
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:1234
para vincular el puerto 1234 en todas las interfaces. Y así. Espero que esto ayude.
Según javax.management.remote.rmi
esta URL se ensambla así
service:jmx:rmi://ignoredhost/jndi/rmi://myhost/myname