J'ai une solution pour cela:
Si votre processus Java s'exécute sous Linux derrière un pare - feu et que vous souhaitez démarrer JConsole / Java VisualVM / Java Mission Control sur Windows sur votre machine locale pour le connecter au port JMX de votre processus Java .
Vous devez accéder à votre machine Linux via une connexion SSH. Toutes les communications seront acheminées via la connexion SSH.
CONSEIL: cette solution fonctionne, qu'il y ait un pare-feu ou non.
Inconvénient: chaque fois que vous redémarrez votre processus java, vous devrez recommencer toutes les étapes de 4 à 9.
1. Vous avez besoin de la suite de mastic pour votre machine Windows à partir d'ici:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Au moins le putty.exe
2. Définissez un port libre sur votre machine Linux:
<jmx-remote-port>
Exemple:
jmx-remote-port = 15666
3. Ajoutez des arguments au processus java sur la machine Linux
Cela doit être fait exactement comme ça. Si c'est fait comme ci-dessous, cela fonctionne pour les machines Linux derrière des pare-feu (cela fonctionne à cause de l' -Djava.rmi.server.hostname=localhost
argument).
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
Exemple:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main
4. Obtenez le Process-Id de votre processus Java
ps -ef | grep <java-processname>
result ---> <process-id>
Exemple:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Trouver un port arbitraire pour le téléchargement des stubs RMIServer
Le processus java ouvre un nouveau port TCP sur la machine Linux, où les stubs du serveur RMI seront disponibles au téléchargement. Ce port doit également être disponible via SSH Tunnel pour obtenir une connexion à la machine virtuelle Java.
Avec netstat -lp
ce port, vous pouvez également trouver des lsof -i
indications sur le port ouvert depuis le processus java.
REMARQUE: ce port change toujours lorsque le processus java est démarré.
netstat -lp | grep <process-id>
tcp 0 0 *:<jmx-remote-port> *:* LISTEN 24321/java
tcp 0 0 *:<rmi-server-port> *:* LISTEN 24321/java
result ---> <rmi-server-port>
Exemple:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Activez deux tunnels SSH à partir de votre machine Windows avec du mastic
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local
[x] Auto
Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local
[x] Auto
Exemple:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Connectez-vous à votre machine Linux avec Putty avec ce tunnel SSH activé.
Laissez la session de mastic ouverte.
Lorsque vous êtes connecté, Putty tunnelise toutes les connexions TCP vers la machine Linux via le port SSH 22.
Port JMX:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Démarrez JConsole / Java VisualVM / Java Mission Control pour vous connecter à votre processus Java à l'aide de l'URL suivante
Cela fonctionne, car JConsole / Java VisualVM / Java Mission Control pense que vous vous connectez à un port sur votre machine Windows locale. mais Putty envoie toute la charge utile au port 15666 de votre machine Linux.
Sur la machine Linux, le processus java donne d'abord la réponse et renvoie le port RMIServer. Dans cet exemple 37123.
Ensuite, JConsole / Java VisualVM / Java Mission Control pense qu'il se connecte à localhost: 37123 et putty enverra la totalité de la charge utile à la machine Linux
Le processus java répond et la connexion est ouverte.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Exemple:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. ENJOY # 8-]