2011-12-05 1 views
6

Sto lavorando su Java RMI. Sto avendo un piccolo problema con il mio rmiregistry sulla porta 2028, come ho già usato quello per eseguire il mio programma di test. Posso eseguire il mio programma usando un'altra porta, ma mi piacerebbe sapere, come possiamo chiudere rmiregistry in esecuzione sulla porta perticolare?Come chiudere rmiregistry in esecuzione su una particolare porta?

+0

Stai iniziando rmiregistry in modo programmatico o manuale come processo separato? – Tudor

+0

No. Lo avvio come shell Linux come segue% rmiregistry 2028 e – slonkar

+0

Se lo si avvia manualmente, non è possibile arrestarlo manualmente? – Tudor

risposta

9

Se si vuole fare questo in programmazione, facciamo qualcosa di simile:

// create the registry 
Registry rmiRegistry = LocateRegistry.createRegistry(port); 
... 
// connect to it 
JMXConnectorServer connector = 
    JMXConnectorServerFactory.newJMXConnectorServer(url, 
     new HashMap<String, Object>(), 
     ManagementFactory.getPlatformMBeanServer()); 
// do stuff with it ... 

// close the connection 
if (connector != null) { 
    connector.stop(); 
} 
// deregister the registry 
if (rmiRegistry != null) { 
    UnicastRemoteObject.unexportObject(rmiRegistry, true); 
} 

Ecco il full code for our JMXServer class. Abbiamo problemi con la creazione di 2 di questi e la annulliamo completamente la registrazione in modo da assicurarci di eseguire i nostri test unitari su porte diverse.

Io uso questo codice nel mio pacchetto client/servizio SimpleJmx JMX.

+0

Sto iniziando rmiregistry dalla shell. Non utilizzarlo tramite il programma. – slonkar

+1

Stavo riscontrando un problema simile in Eclipse, in cui la discussione del registro continuava a essere eseguita per sempre con i frammenti di codice sopra. Aggiunto System.exit (0) fino alla fine, che uccide tutti i thread nella JVM, e tutto finisce bene ;-) –

+0

+1 Stavo fermando il connettore ma non riuscivo a capire come sbarazzarmi del socket del server del registro. Grazie per la risposta. – dannrob

1

Se si esegue rmiregistry dalla shell tenta di chiudere con:

Process p = 
Runtime.getRuntime().exec("ps -ef | grep rmiregistry | awk '{ print $2 }' | kill -9"); 

Io non sono così fresco con i comandi della shell, ma spero che si ottiene l'idea.

+0

Immagino che dalla shell dovrò usare ps -ef | grep rmiregistry. Non l'ho ancora provato. Ma sicuramente te lo farò sapere. Grazie. – slonkar

+0

@ Tudor: mi dispiace amico non ha funzionato ... Ma ho trovato la risposta per farlo. – slonkar

6

Dopo tanta fatica mi rendo conto improvvisamente che rmiregistry gira sullo sfondo della shell. Quindi tutto ciò che dobbiamo fare per chiuderlo prima portalo in primo piano e poi chiudilo. E ha funzionato.

BTW per portarlo alle conoscenze acquisite solo tipo:

% fg 

e poi per chiuderla tipo:

Ctrl + c

Questo è tutto. Grazie mille a tutti quelli che hanno cercato di darmi una mano.

1

Se il registro rmi sta già utilizzando la porta e si desidera riassociare un servizio senza utilizzare un'altra porta. Puoi provare il codice sottostante

Registry registry = null; 
try { 
    registry = LocateRegistry.createRegistry(1099); 
} catch (ExportException ex) { 
    registry = LocateRegistry.getRegistry(1099); 
} catch (RemoteException ex) { 
    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); 
}