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?
risposta
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.
Sto iniziando rmiregistry dalla shell. Non utilizzarlo tramite il programma. – slonkar
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 ;-) –
+1 Stavo fermando il connettore ma non riuscivo a capire come sbarazzarmi del socket del server del registro. Grazie per la risposta. – dannrob
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.
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.
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);
}
Stai iniziando rmiregistry in modo programmatico o manuale come processo separato? – Tudor
No. Lo avvio come shell Linux come segue% rmiregistry 2028 e – slonkar
Se lo si avvia manualmente, non è possibile arrestarlo manualmente? – Tudor