2012-05-31 12 views
6

Ho problemi a effettuare una chiamata JMX remota a JBoss 6 su un server Centos 5.6. Sono già stato in grado di farlo quando eseguivo la stessa app su un server Debian.NoRouteToHostException/NoSuchHostException sulla chiamata JMX remota

./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 stessa chiamata ha esito positivo se la eseguo localmente su SERVER. Ho aperto la porta 1090 con iptables e posso collegarmi via telnet a SERVER: 1090. hostname -i restituisce l'indirizzo IP corretto.

Ho anche provato ad avviare JBoss con -Djava.rmi.server.hostname=localhost. Se faccio questo, allora ottengo un'eccezione diversa:

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

Cosa succede se si effettua la chiamata JMX utilizzando l'indirizzo IP del server? –

+0

@SamGoldberg La stessa cosa, purtroppo –

risposta

4

Risulta che in aggiunta alla porta 1090, JMX/RMI utilizza anche una porta allocato dinamicamente, che viene bloccato dal firewall. Quindi, se è necessario, disattivare il firewall del tutto, altrimenti questo sembra essere un'alternativa (che non ho ancora provato):

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

+2

Un'alternativa è impostare un tipo di VPN per instradare l'intervallo di porte completo a uno specifico indirizzo IP attraverso un tunnel. Un mio cliente ha implementato il proprio agente JVM in C per essere in grado di tunnelare il protocollo JMX tramite SSH ... Quindi è davvero un problema comune. –

+0

Hai salvato la mia giornata –

1

Quello che ho fatto è stato questo:

Aggiornare il file activemq.xml e specificare rmiServerPort.

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

Consentire entrambe le porte aggiornando la voce iptables, riavviare activemq e dovrebbe funzionare.