Tôi có một giải pháp cho điều này:
Nếu quy trình Java của bạn đang chạy trên Linux sau tường lửa và bạn muốn khởi động JConsole / Java VisualVM / Java Mission Control trên Windows trên máy cục bộ của mình để kết nối nó với Cổng JMX của quy trình Java của bạn .
Bạn cần truy cập vào máy linux của mình thông qua đăng nhập SSH. Tất cả Thông tin liên lạc sẽ được đào hầm qua kết nối SSH.
MẸO: Giải pháp này hoạt động bất kể có tường lửa hay không.
Bất lợi: Mỗi khi bạn khởi động lại quy trình java của mình, bạn sẽ cần thực hiện lại tất cả các bước từ 4 đến 9.
1. Bạn cần có bộ putty cho máy Windows của mình từ đây:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Ít nhất là putty.exe
2. Xác định một Cổng miễn phí trên máy Linux của bạn:
<jmx-remote-port>
Thí dụ:
jmx-remote-port = 15666
3. Thêm đối số vào quy trình java trên máy linux
Điều này phải được thực hiện chính xác như thế này. Nếu nó được thực hiện như bên dưới, nó hoạt động đối với Máy linux phía sau tường lửa (Nó hoạt động là nguyên nhân của -Djava.rmi.server.hostname=localhost
đối số).
-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
Thí dụ:
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. Nhận Process-Id của Quy trình Java của bạn
ps -ef | grep <java-processname>
result ---> <process-id>
Thí dụ:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Tìm Cổng tùy ý để tải xuống sơ khai RMIServer
Quá trình java mở một Cổng TCP mới trên máy linux, nơi các RMI Server-Stubs sẽ có sẵn để tải xuống. Cổng này cũng cần có sẵn thông qua Đường hầm SSH để có kết nối với Máy ảo Java.
Với netstat -lp
cổng này cũng có thể tìm thấy các lsof -i
gợi ý cổng nào đã được mở trong quá trình java.
LƯU Ý: Cổng này luôn thay đổi khi quá trình java được bắt đầu.
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>
Thí dụ:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Kích hoạt hai SSH-Tunnels từ máy Windows của bạn với putty
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
Thí dụ:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Đăng nhập vào máy Linux của bạn bằng Putty khi đã bật SSH-Tunnel này.
Để mở phiên putty.
Khi bạn đã đăng nhập, Putty sẽ chuyển tất cả các Kết nối TCP đến máy linux qua cổng SSH 22.
Cổng JMX:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Khởi động JConsole / Java VisualVM / Java Mission Control để kết nối với Quy trình Java của bạn bằng URL sau
Điều này hoạt động, vì JConsole / Java VisualVM / Java Mission Control nghĩ rằng bạn kết nối với một Cổng trên máy Windows cục bộ của bạn. nhưng Putty gửi tất cả tải trọng đến cổng 15666 đến máy linux của bạn.
Trên máy linux, đầu tiên quá trình java đưa ra câu trả lời và gửi lại Cổng RMIServer. Trong ví dụ này 37123.
Sau đó, JConsole / Java VisualVM / Java Mission Control cho rằng nó kết nối với localhost: 37123 và putty sẽ gửi toàn bộ trọng tải tới máy linux
Quy trình java trả lời và kết nối được mở.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Thí dụ:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. THƯỞNG THỨC # 8-]