Estou tentando abrir uma conexão JMX com um aplicativo java em execução em uma máquina remota.
O aplicativo JVM é configurado com as seguintes opções:
- com.sun.management.jmxremote
- com.sun.management.jmxremote.port = 1088
- com.sun.management.jmxremote.authenticate = false
- com.sun.management.jmxremote.ssl = false
Consigo me conectar localhost:1088
usando jconsole ou jvisualvm. Mas não consigo conectar usando xxx.xxx.xxx.xxx:1088
de uma máquina remota.
Não há firewall entre os servidores ou no sistema operacional. Mas para eliminar essa possibilidade, eu telnet xxx.xxx.xxx.xxx 1088
e eu acho que conectamos, pois a tela do console fica em branco.
Ambos os servidores são Windows Server 2008 x64. Tentei com JVM de 64 bits e 32 bits, nenhum dos dois funciona.
Respostas:
Se fosse no Linux, o problema seria que o localhost é a interface de loopback , você precisa do aplicativo para vincular à sua interface de rede .
Você pode usar o netstat para confirmar que ele não está vinculado à interface de rede esperada.
Você pode fazer isso funcionar chamando o programa com o parâmetro do sistema
java.rmi.server.hostname="YOUR_IP"
, como uma variável de ambiente ou usandofonte
hostname -i
, consulte stackoverflow.com/a/11654322/99834 para obter detalhes.Passei mais de um dia tentando fazer o JMX funcionar de fora do localhost. Parece que a SUN / Oracle falhou em fornecer uma boa documentação sobre isso.
Certifique-se de que o comando a seguir retorne um IP ou HOSTNAME real. Se retornar algo como 127.0.0.1, 127.0.1.1 ou localhost, ele não funcionará e você terá que atualizar o
/etc/hosts
arquivo.Aqui está o comando necessário para habilitar JMX mesmo de fora
Onde, como você supôs, myserver.example.com deve corresponder ao que
hostname -i
retorna.Obviamente, você precisa ter certeza de que o firewall não está bloqueando você, mas tenho quase certeza de que não é o seu problema, sendo o problema o último parâmetro que não está documentado.
fonte
java.rmi.server.hostname=<Public DNS name from AWS EC2 console for the instance>
. Espero que isso ajude alguém.Em meus testes com Tomcat e Java 8, a JVM estava abrindo uma porta efêmera além da especificada para JMX. O código a seguir me consertou; experimente se estiver tendo problemas com o cliente JMX (por exemplo, VisualVM não está se conectando.
Veja também Por que o Java abre 3 portas quando o JMX é configurado?
fonte
http://blogs.oracle.com/jmxetc/entry/trou troubleshooting_connection_problems_in_jconsole
Se você está tentando acessar um servidor que está atrás de um NAT - você provavelmente terá que iniciar o seu servidor com a opção
de forma que os stubs RMI enviados ao cliente contenham o endereço público do servidor, permitindo que ele seja alcançado pelos clientes de fora.
fonte
parece que sua citação final veio muito cedo. Deve estar após o último parâmetro.
Este truque funcionou para mim.
Notei algo interessante: quando inicio meu aplicativo usando a seguinte linha de comando:
Se eu tentar conectar a esta porta de uma máquina remota usando jconsole, a conexão TCP é bem-sucedida, alguns dados são trocados entre o jconsole remoto e o agente jmx local onde meu MBean está implantado e, em seguida, o jconsole exibe uma mensagem de erro de conexão. Eu executei uma captura do WireChark e mostra a troca de dados vinda do agente e do jconsole.
Portanto, este não é um problema de rede, se eu executar um netstat -an com ou sem a propriedade de sistema java.rmi.server.hostname, tenho as seguintes ligações:
Isso significa que em ambos os casos o soquete criado na porta 9999 aceita conexões de qualquer host em qualquer endereço.
Acho que o conteúdo desta propriedade do sistema é usado em algum lugar na conexão e comparado com o endereço IP real usado pelo agente para se comunicar com o jconsole. E se esses endereços não corresponderem, a conexão falhará.
Não tive esse problema ao conectar do mesmo host usando jconsole, apenas de hosts remotos físicos reais. Portanto, suponho que essa verificação seja feita apenas quando a conexão vier de "fora".
fonte
a única coisa que funcionou para mim foi definir / etc / hosts para apontar o nome do host para o ip e não para a interface de loopback e então reiniciar meu aplicativo.
cat / etc / hosts
Esta é a minha configuração:
fonte
Muito obrigado, funciona assim:
java -Djava.rmi.server.hostname = xxx.xxx.xxx.xxx -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl = false -Dcom.sun.management.jmxremote.authenticate = false - Dcom.sun.management.jmxremote.port = 25000 -jar myjar .jar
fonte
Eu sei que este tópico é muito antigo, mas há uma opção adicional que ajudará muito. Veja aqui: https://realjenius.com/2012/11/21/java7-jmx-tunneling-freedom/
-Dcom.sun.management.jmxremote.rmi.port=1099
fonte
Eu tenho o mesmo problema e mudo qualquer nome de host que corresponda ao nome do host local para 0.0.0.0, parece funcionar depois de fazer isso.
fonte
Para habilitar o JMX remoto, passe os parâmetros VM abaixo junto com o Comando JAVA.
fonte
Tente isso, eu testei para acessar JMX dentro do contêiner do docker
Então
$ jconsole localhost: 16000
fonte
Tente usar portas superiores a 3000.
fonte