Pour une raison étrange, je ne peux pas me connecter en utilisant VisualVM
ou jconsole
à un JMX.
Les paramètres utilisés pour démarrer le VM à surveiller:
-Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.port=1100
J'ai vérifié et je peux telnet à ce port, à la fois localement et à distance.
Pourtant, VisualVM ou jconsole ne parviennent pas à se connecter, après avoir passé beaucoup de temps à essayer.
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)
Quel est le problème?
Ajouter -Djava.rmi.server.hostname = Host ip
. Même moi, j'ai été confronté au même problème et cela a fait l'affaire.
Ajout de ce -Djava.rmi.server.hostname = Host ip
force le service RMI à utiliser l'IP hôte au lieu de 127.0.0.1
En plus d'écouter le port que vous avez spécifié (1100), le serveur JMX écoute également un port choisi au hasard (éphémère). Vérifiez, par ex. avec lsof -i|grep Java
si vous êtes sous linux/osx, qui porte le processus Java écoute et assurez-vous que votre pare-feu est également ouvert pour le port éphémère.
J'ai rencontré le problème où il était dit "Ajouter" pour toujours et ne semblait pas pouvoir se connecter. J'ai réussi à résoudre le problème en modifiant les paramètres du proxy jvisualvm (Outils-> options-> réseau). Une fois que j'ai changé l'option en aucun proxy, j'ai pu me connecter. Mon jvm a été démarré avec les options suivantes:
-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>
Puis quand j'ai ajouté la connexion jmx, j'ai spécifié "external_IP_of_server: 2222"
J'ai eu un problème similaire lors de l'utilisation de la redirection de port. J'ai une machine distante avec Tomcat qui écoute les interactions JMX sur localhost:9000
.
Depuis ma machine locale, j'ai l'habitude de faire du transfert de port avec:
ssh -L 9001:localhost:9000 Tomcat.example.com
(le port distant 9000 est donc transmis au port 9001 de ma machine locale).
Puis, quand j'ai essayé d'utiliser VisualVM pour me connecter à localhost:9001
, la connexion a été refusée. JMX semble exiger que les numéros de port des deux côtés soient identiques.
Ma solution utilisait donc les numéros de port 9000 et 9000:
ssh -L 9000:localhost:9000 Tomcat.example.com
Maintenant, VisualVM de ma machine locale se connecte avec succès au Tomcat de la machine distante via localhost:9000
.
Assurez-vous que vous n'avez aucun autre service (Tomcat sur la machine de développement?) Écoutant sur le même port.
Jetez également un œil à configuration correcte des paramètres .
J'ai trouvé le problème, mon service rmi fonctionnait sur l'IP hôte qui était "127.0.0.1". Pour me connecter à distance au jvm, j'ai dû lier l'ip externe au nom d'hôte. Pour ce faire, dans les systèmes Unix, utilisez la commande hostname
pour obtenir le nom du nom d'hôte. Vérifiez ensuite l'IP attribuée au nom d'hôte, pour découvrir cette utilisation ping $(hostname)
vous verrez que le système envoie une requête ping à l'IP du hosname. Si votre IP hôte était la valeur par défaut "127.0.0.1" et que vous vouliez la changer, modifiez simplement le fichier/etc/hosts en tant que superutilisateur. Après avoir redémarré le service rmi, vous pouvez y accéder depuis la machine distante.
Si vous exécutez le fichier jar
(via l'option -jar), vous devez spécifier toutes les autres options avant l'option -jar
!
Depuis que je viens de rejoindre, je ne peux pas voter pour la réponse de Hett, mais cela m'a sauvé la vie d'une autre semaine d'essais et d'erreurs!
Voici un exemple de Dockerfile fonctionnel:
FROM store/Oracle/serverjre:8
RUN mkdir -p /opt/app
ENV APP_PATH /opt/app
WORKDIR $APP_PATH
COPY . $APP_PATH
CMD ["Java", \
"-Dcom.Sun.management.jmxremote", \
"-Dcom.Sun.management.jmxremote.port=9010", \
"-Dcom.Sun.management.jmxremote.rmi.port=9010", \
"-Dcom.Sun.management.jmxremote.authenticate=false", \
"-Dcom.Sun.management.jmxremote.ssl=false", \
"-Djava.rmi.server.hostname=12.345.67.89", \
"-jar", \
"app-service-0.0.1-SNAPSHOT.jar"]
EXPOSE 9010
Mes deux cents aux réponses ci-dessus ..
Je vois que la plupart des réponses ne mentionnent que les noms d'hôtes mais pas de port. Si nous n'avons pas spécifié de ports, le serveur attribuera dynamiquement le port RMI. Il n'y aura aucun problème si les deux serveurs sont dans le même sous-réseau ou s'il n'y a pas de problème de pare-feu. En cas de problème, nous pouvons ajouter le paramètre JVM ci-dessous pour figer.
-Dcom.Sun.management.jmxremote.rmi.port
Ex:
<option name="-Dcom.Sun.management.jmxremote.rmi.port" value="11001"/>
Assurez-vous que les ports RMI et JMX doivent être identiques. Pour en savoir plus, cliquez ici
regardez dans/etc/hosts si vous n'avez pas une mauvaise adresse IP pour votre machine exemple: 127.0.0.1 localhost 127.0.0.2 your_machine 185.12.58.2 your_machine (la bonne IP pour votre machine)
JMX prend l'IP 127.0.0.2 et oublie l'autre