2012-05-31 12 views
6

Tengo problemas para realizar una llamada JMX remota a JBoss 6 en un servidor Centos 5.6. Anteriormente, pude hacer esto cuando ejecuté la misma aplicación en un servidor Debian.NoRouteToHostException/NoSuchHostException en la llamada remota JMX

./twiddle.sh --server=service:jmx:rmi:///jndi/rmi://SERVER:1090/jmxconnector invoke foo:service=bar baz 

Caused by: java.net.NoRouteToHostException: No route to host 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) 
    at java.net.Socket.connect(Socket.java:529) 
    at java.net.Socket.connect(Socket.java:478) 
    at java.net.Socket.<init>(Socket.java:375) 
    at java.net.Socket.<init>(Socket.java:189) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) 

La misma llamada tiene éxito si la ejecuto localmente en SERVER. Abrí el puerto 1090 con iptables y puedo conectarme mediante telnet a SERVER: 1090. hostname -i devuelve la dirección IP correcta.

También intenté iniciar JBoss con -Djava.rmi.server.hostname=localhost. Si hago esto, entonces consigo una excepción diferente:

Caused by: java.rmi.NoSuchObjectException: no such object in table 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142) 
    at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source) 
    at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2327) 
    at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:279) 
    at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248) 
    at org.jboss.console.twiddle.Twiddle.createMBeanServerConnection(Twiddle.java:322) 
    at org.jboss.console.twiddle.Twiddle.connect(Twiddle.java:331) 
    at org.jboss.console.twiddle.Twiddle.access$400(Twiddle.java:60) 
    at org.jboss.console.twiddle.Twiddle$1.getServer(Twiddle.java:217) 
+0

¿Qué sucede si realiza la llamada JMX utilizando la dirección IP del servidor? –

+0

@SamGoldberg Lo mismo, lamentablemente –

Respuesta

4

Resulta que, además de puerto 1090, JMX/RMI también utiliza un puerto asignado dinámicamente, que consigue bloqueado por el firewall. Por lo tanto, si es apropiado, desactivar el firewall por completo, o de lo contrario esto parece ser una alternativa (que no lo he probado todavía):

http://olegz.wordpress.com/2009/03/23/jmx-connectivity-through-the-firewall/

+2

Una alternativa es configurar un tipo de VPN para enrutar el rango completo del puerto a una dirección IP específica a través de un túnel. Un cliente mío ha implementado su propio agente JVM en C para poder tunelizar el protocolo JMX a través de SSH ... Así que realmente es un problema común. –

+0

Salvaste mi día –

1

Lo que hice fue lo siguiente:

actualización de la archivo activemq.xml y especifique rmiServerPort.

<managementContext createConnector="true" connectorPort="SOME_PORT" rmiServerPort="SOME_OTHER" jmxDomainName="org.apache.activemq"/> 

Permitir que ambos puertos actualicen su entrada de iptables, reiniciar activemq y debería funcionar.

Cuestiones relacionadas