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)?
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.
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é.
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
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.
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
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.
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
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