java - management - ¿No se puede conectar remotamente a JMX?
java management (6)
Por algún extraño motivo, no puedo conectarme con VisualVM
o jconsole
a un JMX.
Los parámetros utilizados para iniciar la máquina virtual a supervisar:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1100
Lo revisé, y puedo hacer telnet en este puerto, tanto local como remotamente.
Aún así, VisualVM o jconsole no se conectan, después de pasar un tiempo considerable intentándolo.
REMOTE MACHINE with JMX (debian)
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b03-424-11M3720)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03-424, mixed mode)
MY WORKSTATION (OS X)
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
¿Cuál es el problema?
Además de escuchar el puerto que especificó (1100), el servidor JMX también escucha un puerto elegido aleatoriamente (efímero). Compruebe, por ejemplo, con lsof -i|grep java
si está en linux / osx, qué puertos escucha el proceso java y asegúrese de que su firewall esté abierto para el puerto efímero también.
Agregar -Djava.rmi.server.hostname = host ip
. Incluso yo enfrenté el mismo problema y esto funcionó.
La adición de este -Djava.rmi.server.hostname = host ip
obliga al servicio RMI a usar la IP host en lugar de 127.0.0.1
Encontré el problema, mi servicio rmi se ejecutaba en la IP del host que era "127.0.0.1". Para conectar de forma remota a jvm tuve que vincular la dirección IP externa al nombre de host. Para hacer esto en los sistemas Unix use el comando hostname
para obtener el nombre del nombre de host. Luego, compruebe la ip que está asignada al nombre de host, para descubrir este uso ping $(hostname)
verá que el sistema está haciendo ping a la IP del hosname. Si su dirección IP del servidor era la predeterminada "127.0.0.1" y deseaba cambiarla, simplemente edite el archivo / etc / hosts como superusuario. Después de reiniciar el servicio rmi, puede acceder desde la máquina remota.
Estos son los pasos que funcionaron para mí (se llegó a Debian detrás del firewall en el servidor a través de VPN desde mi Mac local):
Comprobar el servidor ip
nombre de host -i
Use los parámetros de JVM:
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=[jmx port] -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=[server ip from step 1]
Ejecutar aplicación
Encontrar el ID del proceso de ejecución de Java
Verifique todos los puertos utilizados por JMX / RMI
netstat -lp | grep [pid from step 4]
Abra todos los puertos desde el paso 5 en el firewall
Voila.
Experimenté el problema donde decía ''Agregar'' para siempre y no parecía poder conectarme. Pasé el problema cambiando la configuración del proxy jvisualvm (Herramientas-> opciones-> red). Una vez que cambié la opción a Sin Proxy, pude conectarme. Mi jvm se inició con las siguientes opciones:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=2222
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=<external_IP_of_server>
Luego, cuando agregué la conexión jmx, especifiqué "external_IP_of_server: 2222"
Tuve un problema similar al usar el reenvío de puertos. Tengo una máquina remota con Tomcat escuchando interacciones JMX en localhost:9000
.
Desde mi máquina local, estoy acostumbrado a hacer reenvío de puertos con:
ssh -L 9001:localhost:9000 tomcat.example.com
(de modo que el puerto 9000 remoto se reenvía al puerto 9001 de mi máquina local).
Luego, cuando traté de usar VisualVM para conectarme a localhost:9001
, se rechazó la conexión. JMX parece requerir que los números de puerto en ambos lados sean idénticos.
Entonces mi solución estaba usando los números de puerto 9000 y 9000:
ssh -L 9000:localhost:9000 tomcat.example.com
Ahora el VisualVM de mi máquina local se conecta exitosamente al Tomcat de la máquina remota a través de localhost:9000
.
Asegúrese de que no tiene ningún otro servicio (¿Tomcat en la máquina de desarrollo?) Escuchando en el mismo puerto.
También eche un vistazo a la configuración de parámetros correctamente .