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:
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.
El puerto de registro RMI generalmente se conoce porque se establece a través de las propiedades del sistema al inicio de la JVM.
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)
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 abstractojmx y esquema de URLrmi
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:
¡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://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.
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.
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 constantejmx:rmi
- el tipo de servicio compuesto por: tipo abstractojmx
y esquema de URLrmi
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úsquedajmxrmi
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:
fuente
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.
fuente
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 utilizarcom.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 comoservice: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
fuente