RMI-Programme für die Verwendung von IIOP konfigurieren
Ein allgemeiner Leitfaden für die Konvertierung einer RMI-Anwendung, damit sie RMI-IIOP verwendet.
Vorbereitende Schritte
Vorgehensweise
- Falls Sie die RMI-Registry für Namensservices nutzen, müssen Sie zu CosNaming
wechseln:
- Erstellen Sie sowohl im Client- als auch im Server-Code einen Ausgangskontext
(InitialContext) für das JNDI (Java Naming and Directory Interface).Verwenden Sie für eine Java™ -Anwendung den folgenden Code:
import javax.naming.*; ... Context ic = new InitialContext();
Verwenden Sie für ein Applet diesen Alternativcode:import java.util.*; import javax.naming.*; ... Hashtable env = new Hashtable(); env.put("java.naming.applet", this); Context ic = new InitialContext(env);
- Ändern Sie alle Verwendungen der RMI-Registry lookup(), bind()und rebind() , um stattdessen JNDI lookup(), bind()und rebind() zu verwenden.Verwenden Sie anstelle von
Sie haben folgende Möglichkeiten:import java.rmi.*; ... Naming.rebind("MyObject", myObj);
import javax.naming.*; ... ic.rebind("MyObject", myObj);
- Erstellen Sie sowohl im Client- als auch im Server-Code einen Ausgangskontext
(InitialContext) für das JNDI (Java Naming and Directory Interface).
- Wenn Sie die RMI-Registry nicht für Namensservices nutzen,
müssen Sie eine andere Möglichkeit haben, um beim Booten die Anfangsverweise von
Remote-Objekten zu laden. Ihr Servercode könnte beispielsweise die Java-Serialisierung verwenden, um einen RMI-Objektverweis auf einen ObjectOutputStream zu schreiben und diesen an Ihren Clientcode zur Deserialisierung in einen RMI-Stub zu übergeben. Wenn Sie diese Aktion in RMI-IIOP ausführen, müssen Sie auch darauf achten,
dass die Objektverweise vor der Serialisierung und nach der Deserialisierung
mit einem ORB verbunden sind.
- Verwenden Sie auf der Serverseite den Aufruf PortableRemoteObject.toStub() , um einen Stub abzurufen, und verwenden Sie anschließend writeObject() , um diesen Stub in einen ObjectOutputStreamzu serialisieren. Verwenden Sie bei Bedarf Stub.connect() , um den Stub vor der Serialisierung mit einem ORB zu verbinden.Beispiel:
org.omg.CORBA.ORB myORB = org.omg.CORBA.ORB.init(new String[0], null); Wombat myWombat = new WombatImpl(); javax.rmi.CORBA.Stub myStub = (javax.rmi.CORBA.Stub)PortableRemoteObject.toStub(myWombat); myStub.connect(myORB); // myWombat is now connected to myORB. To connect other objects to the // same ORB, use PortableRemoteObject.connect(nextWombat, myWombat); FileOutputStream myFile = new FileOutputStream("t.tmp"); ObjectOutputStream myStream = new ObjectOutputStream(myFile); myStream.writeObject(myStub);
- Verwenden Sie auf der Clientseite readObject() , um einen fernen Verweis auf das Objekt aus einem ObjectInputStreamzu entserialisieren. Bevor der deserialisierte
Stub zum Aufruf von Remote-Methoden verwendet wird, muss er mit
einem ORB verbunden werden.Beispiel:
FileInputStream myFile = new FileInputStream("t.tmp"); ObjectInputStream myStream = new ObjectInputStream(myFile); Wombat myWombat = (Wombat)myStream.readObject(); org.omg.CORBA.ORB myORB = org.omg.CORBA.ORB.init(new String[0], null); ((javax.rmi.CORBA.Stub)myWombat).connect(myORB); // myWombat is now connected to myORB. To connect other objects to the // same ORB, use PortableRemoteObject.connect(nextWombat, myWombat);
Da die JNDI-Methode wesentlich unkomplizierter ist, ist diese möglichst vorzuziehen. - Verwenden Sie auf der Serverseite den Aufruf PortableRemoteObject.toStub() , um einen Stub abzurufen, und verwenden Sie anschließend writeObject() , um diesen Stub in einen ObjectOutputStreamzu serialisieren. Verwenden Sie bei Bedarf Stub.connect() , um den Stub vor der Serialisierung mit einem ORB zu verbinden.
- Ändern Sie entweder Ihre fernen Implementierungsklassen so, dass sie von javax.rmi.PortableRemoteObjectübernommen werden, oder exportieren Sie explizit Implementierungsobjekte nach der Erstellung, indem Sie PortableRemoteObject.exportObject()aufrufen. Weitere Informationen zu diesem Thema finden Sie unter IIOP-Stubs mit dem ORB verbinden.
- Ändern Sie alle Stellen im Code, an denen eine Java-Umsetzung einer fernen Schnittstelle zur Verwendung von javax.rmi.PortableRemoteObject.narrow()vorhanden ist.
- Greifen Sie nicht auf die verteilte Garbage-Collection (Distributed Garbage Collection, DGC) zurück und nutzen Sie keine der DGC-Funktionen von RMI. Verwenden Sie PortableRemoteObject.unexportObject() , damit der ORB seine Referenzen auf ein exportiertes Objekt freigibt, das nicht mehr verwendet wird.
- Generieren Sie die RMI-Stubs und -Bindungen mit dem Befehl rmic und der Option -iiop erneut.Dadurch werden Stub- und Tie-Dateien mit folgenden Namen erstellt:_<implementationName>_Tie.class
_<interfaceName>_Stub.class - Bevor Sie den Server starten, starten Sie den CosNaming -Server (in seinem eigenen Prozess) mit dem Befehl tnameserv .Der CosNaming-Server verwendet die Standardportnummer 2809. Wenn Sie eine andere Portnummer verwenden möchten, geben Sie den Parameter -ORBInitialPort an.
- Beim Starten von Client- und Serveranwendungen müssen Sie einige Systemeigenschaften
angeben.Wenn Sie eine Anwendung ausführen, können Sie die Eigenschaften in der Befehlszeile angeben:
java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory -Djava.naming.provider.url=iiop://<hostname>:2809 <appl_class>
- Falls es sich bei dem Client um ein Applet handelt, müssen Sie im Applet-Tag
einige Eigenschaften angeben.Beispiel:
Im vorliegenden Beispiel wird die Standardportnummer 2809 des Namensservice verwendet. Wenn Sie im vorhergehenden Schritt einen anderen Port angeben, müssen Sie in der Provider-URL dieselbe Portnummer verwenden.java.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory java.naming.provider.url=iiop://<hostname>:2809
Der <Hostname> im Anbieter URL ist der Hostname, der zum Starten des CosNaming -Servers verwendet wurde.