2009-05-07 12 views
74

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

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

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management. jmxremote.authenticate = false
  • com.sun.management.jmxremote.ssl = false

soy capaz de conectarse a través de localhost:1088 usando jconsole o jvisualvm. Pero no puedo conectarme usando xxx.xxx.xxx.xxx:1088 desde una máquina remota.

No hay firewall entre los servidores o en el sistema operativo. Pero para eliminar esta posibilidad I telnet xxx.xxx.xxx.xxx 1088 y creo que se conecta, ya que la pantalla de la consola se queda en blanco.

Ambos servidores son Windows Server 2008 x64. Probé con JVM de 64 bits y 32 bits, ninguno de los dos funciona.

+1

Probablemente relacionada con http://stackoverflow.com/questions/151238/has-anyone-ever-got-a-remote-jmx-jconsole-to-work – tuler

+0

Aquí es guía detallada http: // stackoverflow .com/a/11654322/99834 – sorin

Respuesta

95

si hubiera sido en Linux el problema sería que localhost es la interfaz de bucle invertido, es necesario la aplicación de unirse a su interfaz de red .

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

Usted puede hacer este trabajo mediante la invocación del programa con el parámetro del sistema java.rmi.server.hostname="YOUR_IP", ya sea como una variable de entorno o el uso de

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP 
+1

¡Funciona! ¡Muchas gracias! – tuler

+5

No se olvide de 'hostname -i', vea http://stackoverflow.com/a/11654322/99834 para más detalles. – sorin

+0

¡Funcionó! En nuestro entorno usamos máquinas virtuales VMWare. El servidor estaba en una VM. La VM se desplegó cercada para que tenga direcciones IP internas y externas. Iniciamos el proceso java del servidor con -Djava.rmi.server.hostname = . – buzz3791

-6

Trate de usar los puertos superiores a 3000.

+0

Probado 31088, mismo problema – tuler

6

costuras que su cotización final llega demasiado pronto. Debería ser después del último parámetro.

Este truco funcionó para mí.

me di cuenta de algo interesante: cuando se inicia mi aplicación mediante 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 conectar a este puerto desde una máquina remota usando jconsole, la conexión TCP tiene éxito, algunos datos están intercambiado entre jconsole remoto y el agente local de jmx donde se implementa mi MBean, y luego, jconsole muestra un mensaje de error de conexión. Realicé una captura de wireshark, y muestra el intercambio de datos proveniente tanto del agente como de jconsole.

Por lo tanto, esto no es un problema de red, si realizo un netstat con o sin propiedad del sistema java.rmi.server.hostname, tengo las siguientes asociaciones:

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

Esto significa que, en 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 utiliza en algún lugar de 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. Entonces, supongo que esta verificación se hace solo cuando la conexión proviene del "exterior".

+0

¿Qué quiere decir con "su cita final llega demasiado pronto"? Tengo el mismo problema, veo que se está realizando la conexión TCP, pero eventualmente jconsole afirma que no pudo conectarse. – tsuna

+0

No sé, si no recuerdo mal, había una cita abierta en algún lugar y esta cita no estaba al final de los parámetros. Tal vez fue en un script por lotes, no lo recuerdo. Pero debo admitir que esta respuesta no tiene sentido con respecto a la pregunta ... ¿Tal vez la pregunta ha sido editada? No hay notificación editada en la pregunta ... No sé, lo siento. –

11

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 - que más probablemente tendrá que iniciar el servidor con la opción

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

de manera que los talones de RMI enviados a la El cliente contiene la dirección pública del servidor, lo que permite que los clientes la puedan contactar desde el exterior.

0

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.

51

He pasado más de un día intentando hacer que JMX funcione 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 real o HOSTNAME. 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 

Este es el comando necesario para que 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 usted asumió, myserver.example.com debe coincidir con lo hostname -i devoluciones.

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

+0

Añadiendo -Djava.rmi.server.hostname = myserver.example.com hizo el truco! ¡Gracias! –

+0

Me tomé la libertad de abrir un JDK documenta errores para esto: https://bugs.openjdk.java.net/browse/JDK-8066405 – Klara

+2

"Asegúrese de que el siguiente comando le devuelve una IP real o HOSTNAME. Si lo hace devuelve algo como 127.0.0.1, 127.0.1.1 o localhost, no funcionará y tendrá que actualizar el archivo/etc/hosts ". ¿Qué? – PedroD

4

Muchas gracias, funciona así:

java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun .management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false -Dcom.sun.management.jmxremote.port = 25000-jar myjar .jar

5

lo que funciona para mí era para configurar/etc/hosts para que apunte el nombre de host a la interfaz de usuario y no a la interfaz de bucle invertido y luego reinicie 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 
10

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

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

Véase también Why Java opens 3 ports when JMX is configured?

+0

Este me funcionó –

0

Para habilitar JMX remoto, pasar por debajo de los parámetros de máquina virtual Java, junto con comandos.

-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 
Cuestiones relacionadas