Investigamos en diferentes espacios y así traerte la solución para tu duda, si tienes alguna pregunta puedes dejar tu comentario y contestamos porque estamos para ayudarte.
Solución:
La documentación relevante se puede encontrar aquí:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Inicie su programa con los siguientes parámetros:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Por ejemplo así:
java -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-jar Notepad.jar
-Dcom.sun.management.jmxremote.local.only=false
no es necesariamente necesario, pero sin él, no funciona en Ubuntu. El error sería algo como esto:
01 Oct 2008 2:16:22 PM sun.rmi.transport. customer .TCPTransport$AcceptLoop executeAcceptLoop
WARNING: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=37278] throws
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported.
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:89)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.run(TCPTransport.java:359)
at java.lang.Thread.run(Thread.java:636)
ver http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
También tenga cuidado con -Dcom.sun.management.jmxremote.authenticate=false
lo que hace que el acceso esté disponible para cualquier persona, pero si solo lo usa para rastrear la JVM en su máquina local, no importa.
Actualizar:
En algunos casos, no pude comunicarme con el servidor. Esto luego se solucionó si configuro este parámetro también: -Djava.rmi.server.hostname=127.0.0.1
La ejecución en un contenedor Docker introdujo una gran cantidad de problemas adicionales para la conexión, por lo que es de esperar que esto ayude a alguien. Terminé siendo necesario agregar las siguientes opciones que explicaré a continuación:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=$DOCKER_HOST_IP
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
A diferencia de usar jconsole localmente, debe anunciar una IP diferente a la que probablemente verá dentro del contenedor. Necesitarás reemplazar $DOCKER_HOST_IP
con la IP (nombre DNS) que se puede resolver externamente de su host Docker.
Puertos JMX Remote y RMI
Parece que JMX también requiere acceso a una interfaz de administración remota (jstat) que usa un puerto diferente para transferir algunos datos cuando se arbitra la conexión. No vi ningún lugar inmediatamente obvio en jconsole
para establecer este valor. En el artículo vinculado el proceso fue:
- Intenta conectarte desde
jconsole
con registro habilitado - Fallar
- Averigua qué puerto
jconsole
intentó usar - Usar
iptables
/firewall
reglas según sea necesario para permitir que ese puerto se conecte
Si bien eso funciona, ciertamente no es una solución automatizable. Opté por una actualización de jconsole a VisualVM, ya que le permite especificar explícitamente el puerto en el que jstatd
Esta corriendo. En VisualVM, agregue un nuevo host remoto y actualícelo con valores que se correlacionen con los especificados anteriormente:
Luego haga clic con el botón derecho en la nueva Conexión de host remoto y Add JMX Connection...
No olvide marcar la casilla de verificación Do not require SSL connection
. Con suerte, eso debería permitirle conectarse.
Tenga en cuenta que Java 6 en la última encarnación permite que jconsole se adjunte a un proceso en ejecución incluso después de que se haya iniciado sin encantamientos JMX.
Si está disponible para usted, también considere jvisualvm, ya que proporciona una gran cantidad de información sobre los procesos en ejecución, incluido un generador de perfiles.