Estoy intentando abrir una conexión JMX a una aplicación Java que se ejecuta en una máquina 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
Puedo conectarme 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, telnet xxx.xxx.xxx.xxx 1088
creo que se conecta, ya que la pantalla de la consola se pone en blanco.
Ambos servidores son Windows Server 2008 x64. Probé con JVM de 64 bits y 32 bits, ninguno de los dos funciona.
Respuestas:
Si hubiera estado en Linux, el problema sería que localhost es la interfaz de loopback , necesita que la aplicación se vincule a su interfaz de red .
Puede utilizar 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 del sistema
java.rmi.server.hostname="YOUR_IP"
, ya sea como una variable de entorno o usandofuente
hostname -i
, consulte stackoverflow.com/a/11654322/99834 para obtener más detalles.He pasado más de un día tratando de 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 devuelva 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
/etc/hosts
archivo.Aquí está el comando necesario para habilitar JMX incluso desde fuera
Donde, como asumiste, myserver.example.com debe coincidir con lo que
hostname -i
devuelve.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 el último parámetro que no está documentado.
fuente
java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>
. Espero que esto ayude a alguien.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 en los que su cliente JMX (por ejemplo, VisualVM no se conecta.
Consulte también ¿Por qué Java abre 3 puertos cuando JMX está configurado?
fuente
http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole
Si está intentando acceder a un servidor que está detrás de una NAT, probablemente tendrá que iniciar su servidor con la opción
para que los stubs de RMI enviados al cliente contengan la dirección pública del servidor, lo que permite que los clientes puedan acceder a él desde el exterior.
fuente
parece que su cita final llega demasiado pronto. Debería estar 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 comando:
Si trato de conectarme a este puerto desde una máquina remota usando jconsole, la conexión TCP se realiza correctamente, se intercambian algunos datos entre el jconsole remoto y el agente jmx local donde está implementado mi MBean, y luego, jconsole muestra un mensaje de error de conexión. Realicé una captura de wirehark 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 -an con o sin la propiedad del sistema java.rmi.server.hostname, tengo los siguientes enlaces:
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 de la conexión y se compara con la dirección IP real que usa 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 realiza solo cuando la conexión proviene del "exterior".
fuente
lo que me funcionó fue configurar / etc / hosts para que apunte el nombre de host a la ip y no a la interfaz de bucle invertido y luego reiniciar mi aplicación.
gato / etc / hosts
Esta es mi configuración:
fuente
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
fuente
Sé que este hilo es bastante antiguo, pero hay una opción adicional que será de gran ayuda. Ver aquí: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/
-Dcom.sun.management.jmxremote.rmi.port=1099
fuente
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 hacer eso.
fuente
Para habilitar el control remoto JMX, pase los siguientes parámetros de VM junto con el comando JAVA.
fuente
Pruebe esto, probé para acceder a JMX dentro del contenedor de la ventana acoplable
Luego
$ jconsole localhost: 16000
fuente
Intente usar puertos superiores a 3000.
fuente