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 IDLSprache 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: Modifizieren Sie ihre bestehende RMI-Anwendung so, dass sie das IIOP-Protokoll benutzt und damit Interoperabilität mit CORBA-ORBs bietet. Kopieren Sie am besten Ihre alte RMI-Anwendung, bevor Sie sie modifizerien. RMI over IIOP macht folgende Änderungen notwendig: Ihre KontoImpl-Klasse erweitert anstatt der UnicastRemoteObject die PortableRemoteObject-Klasse aus dem javax.rmi-Package Anstatt des rmiregistry NameServers wird diesmal der CORBA-Kompatible COSNaming-Server benutzt: > tnameserv -ORBInitialPort <port> Ihr Server muss in der main-Methode einen Kontext für JNDI erstellen: import javax.naming.InitialContext; InitialContext INC = new InitialContext(); Das Binden des Remote-Objekts funktioniert mit der rebind-Methode des InitialContextObjekts: INC.rebind("Konto", KontoImpl_object); (Dies ersetzt natürlich die „Registry“ aus der letzten Aufgabe) Erzeugen Sie auf die gleiche Art einen JNDI-Kontext in der main-Methode des Clients. InitialContext bietet eine entpsrechende „lookup“-Methode um eine Referenz von entfernten Objekten zu bekommen. (Sie verwenden dann nicht mehr die lookup-Methode der Naming-Klasse) Nach dem Kompilieren Ihrer Klassen rufen Sie den RMI-Compiler mit der Option iiop auf: > rmic -iiop KontoImpl Der Server wird wie folgt gestartet: > java -Djava.naming.factory.initial=com.sun.jndi.cosnaming.CNCtxFactory Djava.security.policy=<POLICYFILE> Djava.naming.provider.url=iiop://<SERVER:PORTNR> KontoImpl & (Beachten Sie: der Server nimmt keinen Port-Parameter mehr entgegen, ändern Sie also entpsrechend ihre main-Methode) Der Client wird analog zum Server gestartet 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 Verison ihrer Anwendung inklusive Quellcode, eine Prozessliste der laufenden Prozesse wenn das Programm arbeitet und eine vollständige Prozessliste, wenn alle Programme beendet sind, sowie ein Screenshot der Ausgabe der Main-Methode der Terminal Klasse 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?