2011-03-28 26 views
13

Tengo una aplicación web implementada en un servidor de resina remoto y tiene JMX activado.Depuración Error de conexión de JConsole

Puedo telnet al servidor remoto es decir

[email protected]:/tmp$ telnet <remote-ip> 5555 
Trying <remote-ip>... 
Connected to <remote-ip>. 
Escape character is '^]'. 
��sr5javax.management.remote.message.HandshakeBeginMessage�,���6profilestLjava/lang/String;Lversionq~xppt1.0^] 

telnet> q 
Connection closed. 

Pero no puedo conectar con ella usando mi JConsole

$JAVA_HOME/bin/java -cp $JAVA_HOME/lib/jconsole.jar:$JAVA_HOME/lib/tools.jar:pm-common/lib/jmxremote_optional-1_0_1_3.jar sun.tools.jconsole.JConsole service:jmx:jmxmp://<remote-ip>:5555 

He intentado esto con las siguientes versiones de Java pero me sale un 'Conexión Falló en ambas instancias.

## where JAVA_HOME=/opt/java/64/jdk1.5.0_22 
java version "1.5.0_22" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_22-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 1.5.0_22-b03, mixed mode) 

## where JAVA_HOME=/opt/java/64/jdk1.6.0_17 
java version "1.6.0_17" 
Java(TM) SE Runtime Environment (build 1.6.0_17-b04) 
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode) 

¿Tienen alguna idea de cómo depurar esto (es decir, averiguar qué pasa)?

Respuesta

26

Asegúrese de que está ejecutando la aplicación, con las siguientes propiedades java conjunto

-Dcom.sun.management.jmxremote.port=9005 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 

intenta conectar ahora. Si desea depurar esto, puede ejecutar el siguiente comando jconsole con

jconsole -J-Djava.util.logging.config.file=path_to_logging.properties_for_jconsole 

A continuación se muestra el contenido del archivo logging.properties

Logging.properties 

handlers = java.util.logging.ConsoleHandler 


.level = INFO 

java.util.logging.ConsoleHandler.level = FINEST 

java.util.logging.ConsoleHandler.formatter = \ 

java.util.logging.SimpleFormatter 

// Use FINER or FINEST for javax.management.remote.level - FINEST is 

// very verbose... 

javax.management.level = FINEST 

javax.management.remote.level = FINER 

Una vez que ejecute jconsole una ventana separada se abrirá mostrando registros

+0

Ey! ¿Qué pasa con la propiedad que falta 'java.rmi.server.hostname'. busque esta publicación: http://www.gubatron.com/blog/2010/11/21/jconsole-connection-failed-retry-solved-java-jmx/ !! ¡Espero eso ayude! – Victor

+0

¡También asegúrese de que el archivo de contraseña esté protegido contra lectura! es decir. solo el usuario puede leerlo: haga esto con chmod 600 – Mafro34

1

No sé si esto es útil, pero tal vez debería usar el binario jconsole en el directorio bin del JDK en lugar de utilizar el sol no documentado (y sujeto a cambios). * Clases para poner en marcha la consola

+0

Todavía no funcionó. Y no sé cómo depurar esto tampoco. –

+0

Este artículo (http://blogs.sun.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole) que explica los problemas de conexión comunes puede ser útil. Si no funciona, revise/publique los registros de depuración – qwerty

1

Si su aplicación es ejecutándose en JDK 1.6, entonces debería poder conectarla. Si se está utilizando JDK 1.6 antes de luego ejecutarlo con especificando el siguiente argumento JVM

-Dcom.sun.management.jmxremote

+0

No funciona (intenté en JDK1.5 y JDK1.6). Y tampoco sé cómo depurarlo. –

3

me encontré con el mismo problema al iniciar el proceso de Java a través de cygwin . JConsole no se puede conectar. Comenzó a través de win7-cmd todo funciona como se esperaba.

1

Estaba teniendo un problema similar de que la máquina remota estaba detrás del cortafuegos y el cortafuegos estaba bloqueando los puertos definidos por -Dcom.sun.management.jmxremote.port y RMI 46924. Después de permitirme conectarme a estos puertos, me conecté con éxito.

+0

En mi caso, el puerto RMI era 43702 y lo descubrí depurando con logging.properties –

8

Esto finalmente hizo que funcione para mí: Dar esta opción adicional: -Djava.rmi.server.hostname=<ip addres where jvm is running

Así que todos los argumentos de VM que se utilizan para abrir jconsole desde una máquina remota, la JVM en la máquina remota deben comenzar con

-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=<port> -Dcom.sun.management.jmxremote -com.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<ip address> 

Todo el proceso está listado here

+1

Esto también me funcionó. Parece que cuando tiene NAT en marcha, necesita especificar la dirección del servidor. – hacket

+0

Después de una búsqueda larga, agregar -Djava.rmi.server.hostname = finalmente me funciona cuando me conecto desde una máquina diferente. A continuación se muestra los argumentos completos: java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only = false \ -Dcom.sun.management.jmxremote.port = 9999 \ -Dcom. sun.management.jmxremote.authenticate = false \ -Dcom.sun.management.jmxremote.ssl = false \ -Djava.rmi.server.hostname = \ com.example.Main –

Cuestiones relacionadas