Conexión JMX remota


Estoy tratando de abrir una conexión JMX a la aplicación java que se ejecuta en una máquina remota.

La aplicación JVM está configurada con las siguientes opciones:

  • com.sol.gestión.jmxremote
  • com.sol.gestión.jmxremote.puerto = 1088
  • com.sol.gestión.jmxremote.authenticate = false
  • com.sol.gestión.jmxremote.ssl=false

Puedo conectarme usando localhost:1088 usando jconsole o jvisualvm. Pero no puedo conectarme usando xxx.xxx.xxx.xxx:1088 desde un máquina remota.

No hay firewall entre los servidores ni en el sistema operativo. Pero para eliminar esta posibilidad yo telnet xxx.xxx.xxx.xxx 1088 y creo que se conecta, como la pantalla de la consola se vuelve en blanco.

Ambos servidores son Windows Server 2008 x64. Probado con JVM de 64 bits y 32 bits, ninguno funciona.

Author: tuler, 2009-05-07

11 answers

Si hubiera estado en Linux, el problema sería que localhost es la interfaz de bucle invertido, necesita una aplicación para vincularse a su interfaz de red.

Puede usar netstat para confirmar que no está vinculado a la interfaz de red esperada.

Puede hacer que esto funcione invocando el programa con el parámetro system java.rmi.server.hostname="YOUR_IP", ya sea como una variable de entorno o utilizando

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
 100
Author: takete.dk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-02 13:43:19

He pasado más de un día tratando de hacer que JMX trabaje desde fuera de localhost. Parece que SUN / Oracle no pudo proporcionar una buena documentación sobre esto.

Asegúrese de que el siguiente comando le devuelve una IP o NOMBRE DE HOST real. Si devuelve algo como 127.0.0.1, 127.0.1.1 o localhost no funcionará y tendrá que actualizar el archivo /etc/hosts.

hostname -i

Aquí está el comando necesario para habilitar JMX incluso desde fuera

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

Donde como asumiste, myserver.example.com debe coincidir con lo que devuelve hostname -i.

Obviamente, debe asegurarse de que el firewall no lo bloquee, pero estoy casi seguro de que este no es su problema, el problema es el último parámetro que no está documentado.

 58
Author: sorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-25 16:24:48

En mis pruebas con Tomcat y Java 8, la JVM estaba abriendo un puerto efímero además del especificado para JMX. El siguiente código me arregló; pruébelo si tiene problemas cuando su cliente JMX (por ejemplo, VisualVM no se está conectando.

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

También consulte ¿Por qué Java abre 3 puertos cuando se configura JMX?

 14
Author: LeslieM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:48

Http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

Si está intentando acceder a un servidor que está detrás de un NAT, lo más probable es que tenga que iniciar su servidor con la opción

-Djava.rmi.server.hostname=<public/NAT address>

De modo que los stubs de RMI enviados al cliente contengan la dirección pública del servidor permitiendo que los clientes puedan alcanzarla desde el exterior.

 12
Author: h0nIg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-12 12:18:33

Parece que tu cita final llega demasiado pronto. Debe ser después del último parámetro.

Este truco funcionó para mí.

Noté algo interesante: cuando inicio mi aplicación usando la siguiente línea de comandos:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

Si intento conectarme a este puerto desde una máquina remota usando jconsole, la conexión TCP tiene éxito, se intercambian algunos datos entre jconsole remota y el agente jmx local donde se implementa mi MBean, y luego, jconsole muestra un error de conexión mensaje. Realicé una captura de Wireshark, y muestra el intercambio de datos procedentes tanto del agente como de jconsole.

Por lo tanto, esto no es un problema de red, si realizo un netstat-an con o sin java.rmi.servidor.hostname propiedad del sistema, tengo los siguientes enlaces:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

Significa que en ambos casos el socket creado en el puerto 9999 acepta conexiones desde cualquier host en cualquier dirección.

Creo que el contenido de esta propiedad del sistema se usa en algún lugar en la conexión y se compara con la dirección IP real utilizada por el agente para comunicarse con jconsole. Y si esas direcciones no coinciden, la conexión falla.

No tuve este problema al conectarme desde el mismo host usando jconsole, solo desde hosts remotos físicos reales. Por lo tanto, supongo que esta comprobación se realiza solo cuando la conexión proviene del "exterior".

 8
Author: yohann.martineau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-30 17:59:13

Muchas gracias, funciona así:

Java -Djava.rmi.servidor.nombre de host=xxx.xxx.xxx.xxx -Dcom.sol.gestión.jmxremote-Dcom.sol.gestión.jmxremote.ssl = false-Dcom.sol.gestión.jmxremote.authenticate=false-Dcom.sol.gestión.jmxremote.port = 25000-jar myjar .jar

 5
Author: user3406690,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-11 14:42:49

Lo que me funcionó fue configurar /etc/hosts para que apuntara el nombre de host a la ip y no a la interfaz de bucle invertido y luego reiniciar mi aplicación.

Cat/etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

Esta es mi configuración:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false
 5
Author: Maoz Zadok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 09:01:22

Tengo el mismo problema y cambio cualquier nombre de host que coincida con el nombre de host local a 0.0.0.0, parece que funciona después de hacerlo.

 0
Author: ianpojman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 20:13:53

Para habilitar JMX remote, pase por debajo de los parámetros de la VM junto con el comando JAVA.

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in
 0
Author: Ajay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-04 08:36:24

Sé que este hilo es bastante viejo, pero hay una opción adicional que ayudará mucho. Ver aquí: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/

-Dcom.sun.management.jmxremote.rmi.port=1099

 0
Author: Jonathan S. Fisher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-18 18:12:38

Intente usar puertos superiores a 3000.

 -6
Author: darko.topolsek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-07 13:25:21