2009-07-06 11 views
2

Verwenden von RMI, um String-Objekt von WebAppA an WebAppB.WebAppB zu übergeben ist der RMIServer während WebAppA RMIClient ist. Ich habe ContextListener in WebAppB hinzugefügt, so dass der RMI-Dienst sofort startet, wenn der Kontext in Tomcat.And initialisiert wird in der contextDestroyed Methode von tomcat die folgenden Aussagen ich versuche zu schließen/herunter~~POS=TRUNC rmi mit:Schließen von RMI-Registrierung

unexportObject(remoteObj,true); 
LocateRegistry.getRegistry(3232).unbind("MessagePath"); //MessagePath - name of the remote reference 

Aber auch nach der Ausführung der aforeseen Aussagen wird rmi für eingehende Anfragen an Port lauscht 3232.I sah, dass indem Sie in der Eingabeaufforderung "netsat -ano" verwenden. Bitte helfen Sie mir, den RMI-Dienst zu schließen.

Antwort

1

getRegistry gibt nur einen Stub zurück. Verwenden Sie daher die von createRegistry zurückgegebene Instanz in unexportObject. Aber in meinem Fall hilft das auch nicht - die Registrierung ist nicht mehr aktiv, aber die Steckdosen sind noch offen und hört :-(

0

createRegistry wird nicht funktionieren, wenn Sie zum Herunterfahren sind versucht, die Registrierung

.
Registry registry = LocateRegistry.createRegistry(3232); 

Dies wird eine BindException werfen, wenn die Registrierung bereits ausgeführt wird. das Objekt So kann man nicht schaffen es, selbst jedoch in

UnicastRemoteObject.unexportObject(registry, true); 

zu verwenden, wenn Sie

verwenden
Registry registry = LocateRegistry.getRegistry(3232); 

Sie erhalten nur den Stub, der nicht als Parameter zum Exportieren des Objekts verwendet werden kann.

Der Grund ist ein Grund zur Sorge für mich ist, weil ich nur die Registrierung starten möchte, wenn ich überprüfen könnte, hat es noch nicht begonnen. Und ich habe keinen Weg gefunden, das zu tun!

+1

Das * result * von * prior * 'createRegistry()' kann nicht exportiert werden.Um sicherzustellen, dass es läuft, versuchen Sie 'createRegistry()': Wenn Sie die 'BindException' erhalten, rufen Sie' getRegistry() 'auf. Natürlich kann man im ersteren Fall nur aus dem Exportieren herauskommen, aber im letzteren Fall ist es das Register eines anderen, also sind sie für das Exportieren verantwortlich. – EJP

-1

Ich habe einen Weg des Abschaltens der Registrierung von jedem Prozess (und was das betrifft heruntergefahren alle gebundenen Prozesse, die in der Registrierung gebunden sind) gefunden

Jede der Schnittstellen, die und Sie möchten die schließlich entfernten erstreckt auch die folgende Schnittstelle erweitern töten soll:

public interface PIDSupplierInterface extends Remote { 
    String getPID() throws RemoteException; 
} 

jeden Server Klasse, die Sie mit diesem als Teil seiner Schnittstelle erstellen muss dann implementieren getpid(). Sie müssen dann die Prozess-ID zurückgeben. Google "getpids" für Windows, oder gehen Sie hier: www.jroller.com/santhosh/entry/get_current_java_process_id. Für Linux, wie ich es verstehe, ist es einfacher, die PID zu bekommen. Dann ist (unter Windows) Sie

String PID = myServer.getPID(); 
String[] a_command = { "taskkill", "/pid", PID }; 
Runtime.getRuntime().exec(a_command, envp, dir); 

gehen, um die PID der Registrierung zu töten, selbst, zuerst, wenn Sie die Registrierung (programmatisch) starten, gehen Sie einfach

PIDSupplierInterface stub = PIDSupplierInterface)UnicastRemoteObject.exportObject( 
new PIDSupplierServer(), 0); 
reg.bind("regKiller", stub); 

wo PIDSupplierServer eine Klasse die nur PIDSupplierInterface implementiert.

Dann, wenn Sie den RMI-Registry von jedem Prozess töten wollen, gehen Sie einfach

PIDSupplierInterface regProcess = (PIDSupplierInterface)reg.lookup("regKiller"); 
String regPID = regProcess.getPID(); 
String[] a_command = { "taskkill", "/pid", regPID }; 
Runtime.getRuntime().exec(a_command, envp, dir); 

die reg wird von dem System verschwunden. Oder ist Ihre Frage aus irgendeinem Grund komplizierter? Alle Kommentare sind willkommen.

+0

Wie genau werden Sie die RMI Registry davon überzeugen, 'PIDSupplierInterface' zu ​​implementieren? und verkörpern 'PIDSupplierServer'? – EJP