102 votes

Distance de connexion JMX

J'essaie d'ouvrir une connexion JMX pour application java s'exécutant sur une machine distante.

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

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

Je suis en mesure de vous connecter à l'aide de localhost:1088 à l'aide de jconsole ou jvisualvm. Mais je ne suis pas en mesure de se connecter à l'aide de xxx.xxx.xxx.xxx:1088 à partir d'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é, j' telnet xxx.xxx.xxx.xxx 1088 et je pense qu'il se connecte, comme l'écran de la console tourne à vide.

Les deux serveurs Windows Server 2008 x64. Essayé avec la JVM 64 bits et 32 bits, ni travail.

122voto

takete.dk Points 1336

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

Vous pouvez utiliser la commande netstat pour confirmer qu'il n'est pas lié à la probable interface réseau.

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 de l'utilisation de

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP

69voto

sorin Points 23747

J'ai passer plus d'une journée à essayer de faire JMX pour travailler à partir de l'extérieur de localhost. Il semble que SUN/Oracle a omis de fournir une bonne documentation sur ce sujet.

Assurez-vous que la commande suivante vous donne une vraie IP ou nom d'hôte. Si elle retourne quelque chose comme 127.0.0.1, ou localhost 127.0.1.1 il ne fonctionnera pas et vous devrez mettre à jour /etc/hosts le fichier.

hostname -i

Voici la commande nécessaire pour permettre à 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 l'avez supposé, myserver.example.com doit correspondre à ce qui hostname -i de rendement.

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

12voto

h0nIg Points 71

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

Si vous essayez d'accéder à un serveur qui est derrière un NAT - vous allez probablement avoir à démarrer votre serveur avec l'option

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

de sorte que le RMI talons envoyé au client, le serveur l'adresse publique lui permettant d'être atteint par les clients de l'extérieur.

8voto

yohann.martineau Points 439

il semble que votre fin citation est 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: lorsque je lance 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'un ordinateur distant à l'aide de jconsole, la connexion TCP réussit, certaines données sont échangées entre la télécommande jconsole et locales agent jmx où mon MBean est déployé, et puis, jconsole affiche une erreur de connexion message. J'ai effectué une capture wireshark, et il montre l'échange de données provenant à la fois agent et jconsole.

Ainsi, ce n'est pas un problème de réseau, si je fais un netstat-an avec ou sans java.rmi.serveur.nom d'hôte du système de la propriété, j'ai les liaisons suivantes:

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

Cela signifie que dans les deux cas, le socket créé sur le port 9999 accepte les connexions à partir de n'importe quel hôte n'importe quelle adresse.

Je pense que le contenu de ce système est utilisé quelque part à la connexion, et en comparaison avec l'adresse IP utilisée par l'agent de communiquer avec jconsole. Et si ces adresses ne correspondent pas, la connexion échoue.

Je n'ai pas eu ce problème lors de la connexion à partir de la même hôte à l'aide de jconsole, uniquement à partir de physique de l'hôte distant. Donc, je suppose que cette vérification est effectuée uniquement lorsque la connexion est venue de "l'extérieur".

5voto

user3406690 Points 21

Merci beaucoup, cela fonctionne comme ceci:

java -Djava.rmi.serveur.hostname=xxx.xxx.xxx.xxx -Dcom.soleil.de la gestion.jmxremote -Dcom.soleil.de la gestion.jmxremote.ssl=false -Dcom.soleil.de la gestion.jmxremote.authentifier=false -Dcom.soleil.de la gestion.jmxremote.port=25000 -jar myjar.jar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X