У мене є рішення для цього:
Якщо ваш Java-процес працює на Linux за брандмауером, і ви хочете запустити JConsole / Java VisualVM / Java Mission Control в Windows на локальній машині, щоб підключити його до порту JMX вашого процесу Java .
Вам потрібен доступ до вашої машини Linux через SSH логін. Вся комунікація буде налаштована через з'єднання SSH.
Порада. Це рішення працює незалежно від того, є брандмауер чи ні.
Недолік: Щоразу, коли ви перезапускаєте процес Java, вам потрібно буде робити всі кроки від 4 до 9 знову.
1. Вам потрібен комплект шпаклівки для вашої машини Windows звідси:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Принаймні putty.exe
2. Визначте один вільний порт на вашій машині Linux:
<jmx-remote-port>
Приклад:
jmx-remote-port = 15666
3. Додайте аргументи до процесу java на машині Linux
Це потрібно зробити саме так. Якщо це зроблено, як показано нижче, він працює для linux Machines за брандмауерами (Це працює причиною -Djava.rmi.server.hostname=localhost
аргументу).
-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
Приклад:
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. Отримайте Process-Id вашого Java-процесу
ps -ef | grep <java-processname>
result ---> <process-id>
Приклад:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Знайдіть довільний порт для завантаження заглушок RMIServer
Процес java відкриває новий порт TCP на машині linux, де для завантаження будуть доступні RMI Server-Stubs. Цей порт також повинен бути доступний через тунель SSH для підключення до віртуальної машини Java.
З netstat -lp
цим портом можна знайти також lsof -i
підказки, який порт був відкритий у процесі Java.
ПРИМІТКА. Цей порт завжди змінюється при запуску Java-процесу.
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>
Приклад:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Увімкніть два тунелі SSH зі своєї машини Windows за допомогою шпаклівки
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
Приклад:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Увійдіть на свою машину Linux за допомогою програми Putty з цим SSH-тунелем.
Залиште сеанс шпаклівки відкритим.
Коли ви ввійдете в систему, Putty буде тунелювати всі TCP-підключення до машини Linux через порт SSH 22.
Порт JMX:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Запустіть JConsole / Java VisualVM / Java Mission Control, щоб підключитися до вашої програми Java за допомогою наступної URL-адреси
Це працює, тому що JConsole / Java VisualVM / Java Mission Control думає, що ви підключитесь до порту на локальній машині Windows. але Putty відправляє все корисне навантаження на порт 15666 на вашу машину Linux.
На машині Linux спочатку процес Java дає відповідь і повертає назад RMIServer Port. У цьому прикладі 37123.
Тоді JConsole / Java VisualVM / Java Mission Control вважає, що він підключається до localhost: 37123 і putty відправить весь корисний вантаж вперед на машину Linux
Java Process відповідає, і з'єднання відкрите.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Приклад:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. ПРАВИЛО # 8]