Eu tenho uma solução para isso:
Se o seu processo Java estiver sendo executado no Linux atrás de um firewall e você deseja iniciar o JConsole / Java VisualVM / Java Mission Control no Windows em sua máquina local para conectá-lo à porta JMX do seu processo Java .
Você precisa acessar sua máquina Linux via login SSH. Toda a comunicação será encapsulada pela conexão SSH.
DICA: Esta solução funciona independentemente da existência de firewall ou não.
Desvantagem: sempre que reiniciar o processo java, você precisará executar todas as etapas de 4 a 9 novamente.
1. Você precisa do conjunto de massa para a sua máquina Windows a partir daqui:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
Pelo menos o putty.exe
2. Defina uma porta livre em sua máquina Linux:
<jmx-remote-port>
Exemplo:
jmx-remote-port = 15666
3. Adicione argumentos para o processo java na máquina Linux
Isso deve ser feito exatamente assim. Se for feito como a seguir, funciona para máquinas Linux atrás de firewalls (funciona por causa do -Djava.rmi.server.hostname=localhost
argumento).
-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
Exemplo:
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. Obtenha a Id do processo de seu processo Java
ps -ef | grep <java-processname>
result ---> <process-id>
Exemplo:
ps -ef | grep ch.sushicutta.jmxremote.Main
result ---> 24321
5. Encontre uma porta arbitrária para download de stubs RMIServer
O processo java abre uma nova porta TCP na máquina linux, onde os Stubs do servidor RMI estarão disponíveis para download. Essa porta também precisa estar disponível por meio do túnel SSH para obter uma conexão com a Java Virtual Machine.
Com netstat -lp
esta porta pode ser encontrada também alsof -i
dá dicas de qual porta foi aberta do processo java.
NOTA: Esta porta sempre muda quando o processo java é iniciado.
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>
Exemplo:
netstat -lp | grep 24321
tcp 0 0 *:15666 *:* LISTEN 24321/java
tcp 0 0 *:37123 *:* LISTEN 24321/java
result ---> 37123
6. Habilite dois túneis SSH de sua máquina Windows com massa
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
Exemplo:
Source port: 15666
Destination: localhost:15666
[x] Local
[x] Auto
Source port: 37123
Destination: localhost:37123
[x] Local
[x] Auto
7. Faça login em sua máquina Linux com Putty com este túnel SSH ativado.
Deixe a sessão de massa aberta.
Quando você estiver logado, o Putty fará um túnel de todas as conexões TCP para a máquina Linux através da porta 22 SSH.
Porta JMX:
Windows machine: localhost:15666 >>> SSH >>> linux machine: localhost:15666
RMIServer-Stub-Port:
Windows Machine: localhost:37123 >>> SSH >>> linux machine: localhost:37123
8. Inicie o JConsole / Java VisualVM / Java Mission Control para se conectar ao seu processo Java usando a seguinte URL
Isso funciona, porque o JConsole / Java VisualVM / Java Mission Control pensa que você se conectou a uma porta em sua máquina Windows local. mas Putty envia toda a carga útil para a porta 15666 para sua máquina Linux.
Na máquina linux, primeiro o processo java responde e envia de volta a porta RMIServer. Neste exemplo 37123.
Então JConsole / Java VisualVM / Java Mission Control pensa que se conecta ao localhost: 37123 e o putty enviará toda a carga útil para a máquina Linux
O processo java responde e a conexão é aberta.
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi
Exemplo:
[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi
9. APROVEITE # 8-]