RMI over IIOP Da es Java RMI over JRMP an Interoperabilität mit anderen Sprachen mangelt, sollten sich vorher die Java Programmierer von verteilten Anwendungen zwischen der Benutzung von Java RMI over JRMP und der Benutzung von Java-IDL von CORBA entscheiden. Die Lösung für diese Einschränkung bringt die als Java RMI over IIOP bekannte Technologie. Mit RMI over IIOP bietet sich nun die Möglichkeit, RMI-Objekte in eine CORBA-Umgebung einzubinden. Die Kommunikation erfolgt dabei anders als mit RMI-JRMP durch den CORBA-ORB. Als Folge können RMI Objekte das IIOP Protokoll benutzen und mit CORBAObjekten kommunizieren. Zum Beispiel können Komponenten, welche in C++ oder in anderen von CORBA unterstützten Sprachen geschrieben sind, mit Komponenten, welche in der Java Umgebung laufen, interagieren. RMI over IIOP bietet daher den großen Vorteil, remote Interfaces einfach mit der Programmiersprache Java zu schreiben und diese mit Benutzung der Technologie von Java und den APIs von Java RMI zu implementieren. Es ist nicht nötig, eine separate IDL-Sprache zu lernen. Der Vorteil von RMI over JRMP des Tauschens der serialisierbaren Objekte bleibt auch in der RMI over IIOP Technologie erhalten. Die Schritte bei der Realisierung einer verteilten Anwendung sind bei beiden Techniken gleich. Allerdings sind einige Einschränkungen bei der Programmierung und Kompilierung zu beachten. Ihre Aufgabe: Die verteilte Anwendung mit RMI over IIOP Ziel: Die gleiche Anwendung wie in Teil a) diesmal als eine RMI over IIOP Anwendung zu schreiben. Folgende Vorgehensweise wird wieder verlangt: 1. Das Quadrat Interface (Quadrat.java) soll nicht verändert werden. 2. Die Klasse QuadratImpl soll diesmal die PortableRemoteObject-Klasse aus dem javax.rmi-Package erweitern anstatt der UnicastRemoteObject-Klasse. 3. In der QuadratImpl main()-Methode wird mit folgendem Code ein InitialContext für JNDI erzeugt: import javax.naming.InitialContext; InitialContext INC = new InitialContext(); Für das Binden des Serverobjekts an einen Namen wird nicht mehr die rebind() Methode der RMI-Registry benutzt, sondern die des JNDI: INC.rebind("Quadrat", QuadratImpl_Objekt); Es wird in diesem Fall der Name "Quadrat" mit dem QuadratImpl_Objekt gebunden. 4. In der Klientenklasse QuadratClient muss auch ein InitialContext für JNDI erzeugt werden. Mit Hilfe der assoziierten lookup() Methode können sie nun an die Referenz des entfernten Objekts gelangen. 5. Die Klassen kompilieren und anschließend den RMI-Compiler mit der Option „–iiop“ auf der Implementierungsklasse aufrufen. 6. Für die Registrierung des entfernten Objekts wird diesmal der CosnamingServer benutzt statt des registry-Servers: > tnameserv -ORBInitialPort <Portnummer> 7. Das Starten des Servers kann nun wie folgt erfolgen > java Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory Djava.security.policy=<POLICYFILE> -Djava.naming.provider.url=iiop://<SERVER:PORTNR> ServerProc & 8. Nun kann der Client analog zum Server (s. oben) ausgeführt werden. Hinweise: • • Benutzen sie bitte Ports zwischen 2500 und 15000 um nicht die Arbeit ihrer Kollegen zu stören Bitte beenden Sie am Ende wieder Ihren gestarteten tnameserv! Abgabe: Als Abgabe wird eine funktionierende Version der Aufgaben inklusive Quellcode, eine Prozessliste der laufenden Prozesse wenn das Programm arbeitet und eine vollständige Prozessliste, wenn alle Programme beendet sind, erwartet. Zusätzlich müssen folgende Fragen beantwortet werden: 1. Welche Vorteile gewinnt man durch die Nutzung von RMI over IIOP? 2. Wofür steht JNDI? Wozu dient es?