Connexion JMX à distance

j'essaie d'ouvrir une connexion JMX à une application java tournant sur une machine distante.

L'application JVM est configurée avec les options suivantes:

  • com.soleil.gestion.jmxremote
  • com.soleil.gestion.jmxremote.port=1088
  • com.soleil.gestion.jmxremote.authentifier=false
  • com.soleil.gestion.jmxremote.ssl = false

je peux me connecter en utilisant localhost:1088 en utilisant jconsole ou jvisualvm. Mais je ne peux pas me connecter en utilisant xxx.xxx.xxx.xxx:1088 depuis une machine distante.

il n'y a pas de pare-feu entre les serveurs, ou sur le système D'exploitation. Mais pour éliminer cette possibilité Je telnet xxx.xxx.xxx.xxx 1088 et je pense qu'il se connecte, comme l'écran de la console tourne blanc.

les deux serveurs sont Windows Server 2008 x64. Essayé avec 64 bits JVM et 32 bits, ni l'un ni l'autre ne fonctionne.

82
demandé sur tuler 2009-05-07 17:12:39

11 réponses

S'il avait été sur Linux le problème serait que localhost est l'interface de loopback , vous avez besoin d'application pour se lier à votre interface réseau .

vous pouvez utiliser netstat pour confirmer qu'il n'est pas lié à l'interface réseau attendue.

vous pouvez faire ce travail en invoquant le programme avec le paramètre de système java.rmi.server.hostname="YOUR_IP" , soit comme une variable d'environnement ou en utilisant

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP
100
répondu takete.dk 2012-06-02 13:43:19

j'ai passé plus d'une journée à essayer de faire JMX pour travailler à l'extérieur de localhost. Il semble que SUN / Oracle n'ait pas fourni une bonne documentation à ce sujet.

assurez-vous que la commande suivante vous renvoie une vraie adresse IP ou un vrai nom D'hôte. S'il retourne quelque chose comme 127.0.0.1, 127.0.1.1 ou localhost, il ne fonctionnera pas et vous devrez mettre à jour le fichier /etc/hosts .

hostname -i

Voici la commande nécessaire pour activer JMX même de l'extérieur

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100
-Djava.rmi.server.hostname=myserver.example.com

où comme vous le supposiez, myserver.example.com doit correspondre à ce que hostname -i retourne.

Évidemment, vous devez vous assurer que le pare-feu ne bloque pas vous, mais je suis presque sûr que ce n'est pas votre problème, le problème étant le dernier paramètre qui n'est pas documentée.

58
répondu sorin 2012-07-25 16:24:48

dans Mes tests avec Tomcat et Java 8, la JVM ouvrait un port éphémère en plus de celui spécifié pour JMX. Le code suivant m'a corrigé; essayez si vous avez des problèmes avec votre client JMX (par exemple VisualVM ne se connecte pas.

-Dcom.sun.management.jmxremote.port=8989
-Dcom.sun.management.jmxremote.rmi.port=8989

Voir aussi pourquoi Java ouvre 3 ports lorsque JMX est configuré?

14
répondu LeslieM 2017-05-23 11:54:48

http://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole

si vous essayez d'accéder à un serveur qui se trouve derrière un NAT - vous devrez probablement démarrer votre serveur avec l'option

-Djava.rmi.server.hostname=<public/NAT address>

de sorte que les talons RMI envoyés au client contiennent l'adresse publique du serveur permettant aux clients de l'extérieur d'y accéder.

12
répondu h0nIg 2012-11-12 12:18:33

il semble que votre citation finale arrive trop tôt. Il devrait être après le dernier paramètre.

Cette astuce a fonctionné pour moi.

j'ai remarqué quelque chose d'intéressant: quand je démarre mon application en utilisant la ligne de commande suivante:

java -Dcom.sun.management.jmxremote.port=9999
     -Dcom.sun.management.jmxremote.authenticate=false
     -Dcom.sun.management.jmxremote.ssl=false

si j'essaie de me connecter à ce port à partir d'une machine distante en utilisant jconsole, la connexion TCP réussit, certaines données sont échangées entre JConsole distante et l'agent local jmx où mon MBean est déployé, puis jconsole affiche un message d'erreur de connexion. J'ai effectué une capture wireshark, et ça montre un échange de données provenant à la fois de l'agent et du jconsole.

donc, ce n'est pas un problème de réseau, si je réalise un netstat-an avec ou sans java.rmi.serveur.propriété du système hostname, j'ai les reliures suivantes:

 TCP    0.0.0.0:9999           0.0.0.0:0              LISTENING
 TCP    [::]:9999              [::]:0                 LISTENING

cela signifie que dans les deux cas la socket créée sur le port 9999 accepte les connexions de n'importe quel hôte sur n'importe quelle adresse.

je pense que le contenu de cette propriété système est utilisé quelque part à la connexion et comparé avec l'adresse IP réelle utilisée par agent pour communiquer avec jconsole. Et si ces adresses ne correspondent pas, la connexion échoue.

Je n'ai pas eu ce problème en me connectant à partir du même hôte en utilisant jconsole, seulement à partir de vrais hôtes physiques distants. Donc, je suppose que cette vérification n'est faite que lorsque la connexion vient de "l'extérieur".

8
répondu yohann.martineau 2011-11-30 17:59:13

Merci beaucoup, ça marche comme ça:

java - Djava.rmi.serveur.nom d'hôte = xxx.xxx.xxx.xxx - Dcom.soleil.gestion.jmxremote-Dcom.soleil.gestion.jmxremote.ssl=false-Dcom.soleil.gestion.jmxremote.authentifier=false-Dcom.soleil.gestion.jmxremote.port=25000-jar myjar .jar

5
répondu user3406690 2014-03-11 14:42:49

ce qui a fonctionné pour moi était de configurer /etc/hosts pour pointer le nom d'hôte vers l'ip et non vers l'interface de loopback et de redémarrer mon application.

cat/etc / hosts

127.0.0.1      localhost.localdomain localhost
192.168.0.1    myservername

C'est ma configuration:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false
5
répondu Maoz Zadok 2014-12-02 09:01:22

j'ai le même problème et j'ai changer n'importe quelle machine qui correspond au nom d'hôte local pour 0.0.0.0, il semble fonctionner après je le fais.

0
répondu ianpojman 2012-05-10 20:13:53

pour activer la télécommande JMX, passez sous les paramètres VM avec la commande JAVA.

    -Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453
    -Dcom.sun.management.jmxremote.authenticate=false                               
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in
0
répondu Ajay 2017-12-04 08:36:24

je sais que ce fil est assez vieux, mais il y a une option supplémentaire qui aidera grandement. Voir ici: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom /

-Dcom.sun.management.jmxremote.rmi.port=1099

0
répondu Jonathan S. Fisher 2018-09-18 18:12:38

essayez d'utiliser des ports supérieurs à 3000.

-6
répondu darko.topolsek 2009-05-07 13:25:21