web-dev-qa-db-fra.com

Le débogage de la connexion JConsole a échoué

J'ai déployé une application Web sur un serveur de résine distant et JMX est activé.

Je peux telnet sur le serveur distant c.-à-d.

franz@see:/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.

Mais je ne peux pas me connecter avec ma 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

J'ai essayé ceci avec les versions Java Java mais j'obtiens une "Échec de connexion" sur les deux instances.

## 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)

Avez-vous une idée de comment déboguer cela (c'est-à-dire savoir ce qui ne va pas)?

23
Franz See

Assurez-vous que vous exécutez votre application en suivant Java properties set

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

Essayez de vous connecter maintenant. Si vous souhaitez déboguer cela, vous pouvez exécuter la jconsole avec la commande suivante

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

Voici le contenu du fichier 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

Une fois que vous exécutez jconsole, une fenêtre séparée apparaîtra affichant les journaux.

36
samarth

si vous exécutez jconsole -debug il vous donne plus d'informations de diagnostic sur l'échec. Voir l'entrée de blog de Daniel Fuchs "Dépannage des problèmes de connexion dans JConsole" .

J'ai fait cela et cela m'a montré que j'utilisais jconsole 32 bits, le processus cible a été démarré avec un jvm différent (64 bits), donc apparemment ce n'est pas autorisé et il a donc échoué.

22
rogerdpack

Cela a finalement fonctionné pour moi: Donner cette option supplémentaire: -Djava.rmi.server.hostname=<ip addres where jvm is running

Donc, tous les arguments vm utilisés pour ouvrir jconsole depuis une machine distante, la jvm sur la machine distante doit être démarrée avec

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

L'ensemble du processus est répertorié ici

10
Lavixu

J'ai rencontré le même problème lors du démarrage du processus Java via cygwin. JConsole ne peut pas se connecter. Commencé par win7-cmd tout fonctionne comme prévu.

3
Stephan

Je ne sais pas si cela est utile, mais vous devriez peut-être utiliser le binaire jconsole dans le répertoire bin JDK plutôt que d'utiliser les classes Sun. * non documentées (et susceptibles de changer) pour démarrer la console

1
qwerty

J'avais un problème similaire: la machine distante était derrière le pare-feu et le pare-feu bloquait les ports définis par -Dcom.Sun.management.jmxremote.port et RMI 46924. Après m'avoir permis de me connecter à ces ports, je me suis connecté avec succès.

1
Ahmet Karakaya

Si votre application est exécutée sur JDK 1.6 alors vous devriez pouvoir la connecter. S'il utilise JDK avant 1.6 alors exécutez-le en spécifiant l'argument JVM suivant

- Dcom.Sun.management.jmxremote

1
GuruKulki

Si vous accédez à une machine derrière un pare-feu, vous devez ouvrir les ports JMX et RMI.
Dans ce contexte, il vaut beaucoup mieux forcer la valeur pour RMI que de compter sur l’auto assignée
Dans mon cas, j'essayais d'accéder à Tomcat, j'ai donc dû procéder comme suit:

#!/bin/sh
CATALINA_OPTS="$CATALINA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=8008 -Dcom.Sun.management.jmxremote.rmi.port=8007 -Dcom.Sun.
management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false"

puis

firewall-cmd --zone=public --add-port=8008/tcp --permanent
firewall-cmd --zone=public --add-port=8007/tcp --permanent
firewall-cmd --reload
0
MonoThreaded