2009-05-07 8 views
74

Sto tentando di aprire una connessione JMX all'applicazione java in esecuzione su una macchina remota.Connessione JMX remota

L'applicazione JVM è configurato con le seguenti opzioni:

  • com.sun.management.jmxremote
  • com.sun.management.jmxremote.port = 1088
  • com.sun.management. jmxremote.authenticate = false
  • com.sun.management.jmxremote.ssl = false

sono in grado di connettersi utilizzando localhost:1088 utilizzando jconsole o jvisualvm. Ma non riesco a connettermi usando xxx.xxx.xxx.xxx:1088 da una macchina remota.

Non esiste un firewall tra i server o sul sistema operativo. Ma per eliminare questa possibilità I telnet xxx.xxx.xxx.xxx 1088 e penso che si connetta, come lo schermo della console diventa vuoto.

Entrambi i server sono Windows Server 2008 x64. Provato con JVM a 64 bit e 32 bit, nessuno dei due funziona.

+1

probabilmente correlate al http://stackoverflow.com/questions/151238/has-anyone-ever-got-a-remote-jmx-jconsole-to-work – tuler

+0

Ecco guida dettagliata http: // StackOverflow .com/a/11654322/99834 – sorin

risposta

95

Se fosse stato su Linux il problema sarebbe che localhost è l'interfaccia di loopback, è necessario applicazione di legarsi alla interfaccia di rete.

È possibile utilizzare netstat per confermare che non è collegato all'interfaccia di rete prevista.

si può fare questo lavoro invocando il programma con il parametro di sistema java.rmi.server.hostname="YOUR_IP", sia come una variabile d'ambiente o utilizzando

java -Djava.rmi.server.hostname=YOUR_IP YOUR_APP 
+1

Funziona! Molte grazie! – tuler

+5

Non dimenticare "hostname -i", vedi http://stackoverflow.com/a/11654322/99834 per i dettagli. – sorin

+0

ha funzionato! Nel nostro ambiente utilizziamo macchine virtuali VMWare. Il server era su una VM. La VM è stata distribuita recintata, quindi ha interni e un indirizzo IP esterno. Abbiamo avviato il processo java del server con -Djava.rmi.server.hostname = . – buzz3791

-6

Provare a utilizzare le porte superiore a 3000.

+0

Provato 31088, stesso numero – tuler

6

cuciture che il tuo preventivo finale arriva troppo presto. Dovrebbe essere dopo l'ultimo parametro.

Questo trucco ha funzionato per me.

ho notato qualcosa di interessante: quando inizio la mia applicazione utilizzando la seguente riga di comando:

java -Dcom.sun.management.jmxremote.port=9999 
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.ssl=false 

Se provo a connettersi a questa porta da un computer remoto utilizzando JConsole, la connessione TCP riesce, alcuni dati sono scambiato tra jconsole remoto e agente jmx locale in cui viene distribuito il mio MBean, quindi jconsole visualizza un messaggio di errore di connessione. Ho eseguito un'acquisizione di wireshark e mostra lo scambio di dati proveniente sia dall'agente che da jconsole.

Quindi, questo non è un problema di rete, se eseguo un netstat con o senza proprietà di sistema java.rmi.server.hostname, ho i seguenti collegamenti:

TCP 0.0.0.0:9999   0.0.0.0:0    LISTENING 
TCP [::]:9999    [::]:0     LISTENING 

Ciò significa che in in entrambi i casi il socket creato sulla porta 9999 accetta connessioni da qualsiasi host su qualsiasi indirizzo.

Penso che il contenuto di questa proprietà di sistema sia utilizzato da qualche parte alla connessione e confrontato con l'effettivo indirizzo IP utilizzato dall'agente per comunicare con jconsole.E se questi indirizzi non corrispondono, la connessione fallisce.

Non ho avuto questo problema durante la connessione dallo stesso host utilizzando jconsole, solo da host fisici fisici remoti. Quindi, suppongo che questo controllo sia fatto solo quando la connessione proviene dal "fuori".

+0

Cosa intendi per "la tua citazione finale arriva troppo presto"? Ho lo stesso problema, vedo la connessione TCP in corso, ma alla fine jconsole afferma che non è riuscito a connettersi. – tsuna

+0

Non so, se ricordo bene, c'era una citazione aperta da qualche parte e questa citazione non era alla fine dei parametri. Forse era in una sceneggiatura discontinua, non ricordo. Ma devo ammettere che questa risposta non ha senso per quanto riguarda la domanda ... Forse la domanda è stata modificata? Nessuna notifica modificata sotto la domanda ... Non lo so, mi dispiace. –

0

Ho lo stesso problema e cambio qualsiasi nome host che corrisponda al nome host locale su 0.0.0.0, sembra funzionare dopo averlo fatto.

51

Ho passato più di un giorno a provare a far funzionare JMX dall'esterno localhost. Sembra che SUN/Oracle non abbia fornito una buona documentazione su questo.

Assicurarsi che il seguente comando restituisca un IP reale o HOSTNAME. Se restituisce qualcosa come 127.0.0.1, 127.0.1.1 o localhost, non funzionerà e dovrai aggiornare il file /etc/hosts.

hostname -i 

Ecco il comando necessario per consentire JMX anche dall'esterno

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1100 
-Djava.rmi.server.hostname=myserver.example.com 

Dove, come si presume, myserver.example.com deve corrispondere a quello hostname -i rendimenti.

Ovviamente, devi essere sicuro che il firewall non ti blocca, ma sono quasi sicuro che questo non è un tuo problema, essendo il problema l'ultimo parametro non documentato.

+0

Aggiungere -Djava.rmi.server.hostname = myserver.example.com ha fatto il trucco! Grazie! –

+0

Mi sono permesso di aprire un bug di documenti JDK per questo: https://bugs.openjdk.java.net/browse/JDK-8066405 – Klara

+2

"Assicurati che il seguente comando ti restituisca un IP reale o HOSTNAME. restituire qualcosa come 127.0.0.1, 127.0.1.1 o localhost non funzionerà e dovrai aggiornare il file/etc/hosts. " Cosa? – PedroD

4

Grazie mille, funziona così:

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

5

la cosa che funziona per me era per impostare/etc/hosts per puntare il nome host sull'ip e non sull'interfaccia di loopback e poi riavviare la mia applicazione.

cat/etc/hosts

127.0.0.1  localhost.localdomain localhost 
192.168.0.1 myservername 

Questa è la mia configurazione:

-Dcom.sun.management.jmxremote.port=1617 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false 
10

Nel mio test con Tomcat e Java 8, la JVM si apriva una porta effimera in aggiunta a quello specificato per JMX. Il seguente codice mi ha risolto; fare un tentativo se si verificano problemi in cui il client JMX (ad esempio VisualVM non si sta connettendo.

-Dcom.sun.management.jmxremote.port=8989 
-Dcom.sun.management.jmxremote.rmi.port=8989 

vedi anche Why Java opens 3 ports when JMX is configured?

+0

Questo ha funzionato per me –

0

Per attivare JMX remoto, passare sotto parametri VM insieme JAVA comando.

-Dcom.sun.management.jmxremote 
    -Dcom.sun.management.jmxremote.port=453 
    -Dcom.sun.management.jmxremote.authenticate=false        
    -Dcom.sun.management.jmxremote.ssl=false 
    -Djava.rmi.server.hostname=myDomain.in