Remote Methode Invocation (RMI) ETIS SS05 Gliederung • Motivation • Ablauf der Kommunikation • Erstellung Remote-Service • Zusammenfassung RMI ETIS SS05 Nadine Fröhlich 2 Motivation I • RMI: Remote Method Invokation • Möglichkeit verteilte Java-Anwendungen zu erstellen – Ermöglicht Methodenaufruf auf Java-Objekten, in anderer JVM auf selben oder anderem Rechner – Fast nahtlos, d.h. kaum Aufwand, um Klasse RMI-fähig zu machen • Architektur zunächst nur zur Kommunikation zwischen JavaAnwendungen eingesetzt – Client und Server in Java programmiert – Seit JDK 1.1 Bestandteil der Standardbibliotheken von Java, d.h. auf allen Plattformen nutzbar, auf denen JavaLaufzeitumgebung verfügbar RMI ETIS SS05 Nadine Fröhlich 3 Motivation I • Problem: – Aufruf eines (Service) Objektes in entfernter JVM nötig (auf selben oder entfernten Rechner) ? Clientobjekt Serviceobjekt ? Server heap Client heap – Folgendes funktioniert nicht (in Klasse Client): • Maschine m = <object in another heap> – Programmierung auf Socket- oder Protokollebene: aufwändig, fehleranfällig, häufig nicht wiederverwendbar RMI ETIS SS05 Nadine Fröhlich 4 Ablauf der Kommunikation I • RMI ermöglicht Finden + Aufruf von Objekten in entfernter JVM, dabei: – keine Unterscheidung zwischen lokalen und entfernten Methodenaufrufen, d.h. transparente Verteilung – Helper Objekte übernehmen Kommunikation – Ablauf: 1. MethodenAufruf() Clientobjekt Clienthelper 6. Ergebnis an Client 2. Informationen zum Methodenaufruf 5. Übermitteln gepacktes Ergebnis Client heap RMI 3. MethodenAufruf() Servicehelper Serviceobjekt 4. Ergebnisrückgabe Server heap ETIS SS05 Nadine Fröhlich 5 Ablauf der Kommunikation II 1. Methodenaufruf – Client ruft Methode auf Client Helper (Stub) auf, als ob dieser aktueller Service wäre – Client Helper • Proxy • tut so, als wäre er Service, den Client aufrufen will • hat selbe Methoden wie Remote Service, aber keine Logik • Informationen zum Methodenaufruf – Client Helper kontaktiert Server, transferiert Informationen über Methodenaufruf (Methodenname, Argumente) und wartet auf Antwort vom Server RMI ETIS SS05 Nadine Fröhlich 6 Ablauf der Kommunikation III 3. Methodenaufruf – Service Helper (Skeleton) nimmt Anfrage entgegen und ruft wirkliche Methoden auf richtigem Service-Objekt auf 4. Ergebnisrückgabe – Service Helper bekommt Rückgabewert vom Service-Objekt 5. Übermitteln gepacktes Ergebnis – Service Helper packt + verschickt Ergebnis an Client-Helper 6. Ergebnis an Client – Client-Helper entpackt Informationen und gibt Werte an Client Objekt zurück RMI ETIS SS05 Nadine Fröhlich 7 Erstellung Remote-Service 1. Remote-Interface erstellen – Remote Interface definiert Methoden, die Client entfernt aufrufen kann – Stub und Service implementieren es 2. Remote Implementierung erstellen – Implementierung macht eigentliche Arbeit (Service) 3. Stub (Client Helper) + Skeleton (Service Helper) generieren – automatisch aus Implementierung mit rmic generiert 4. RMI Registry starten – Wie Telefonbuch, hier erfragt Client den Stub 5. Remote Service starten – Service instanziert + in Registry registriert, dadurch ist er für Clients verfügbar RMI ETIS SS05 Nadine Fröhlich 8 Remote-Interface erstellen • Interface muss von java.rmi.Remote erben • Alle Methoden müssen RemoteException werfen, da bei entfernten Aufrufen Fehler auftreten können • Argumente und Rückgabewerte müssen primitive Datentypen oder serialisierbar sein import java.rmi.*; public interface IRemote extends Remote{ public String echo() throws RemoteException; } RMI ETIS SS05 Nadine Fröhlich 9 Remote Implementierung erstellen • Remote Interface implementieren • von UnicastRemoteObject erben public class RemoteImpl extends UnicastRemoteObject implements IRemote {… • Service muss in RMI Registry registriert werden try{ IRemote service = new RemoteImpl(); Naming.rebind(“ServiceName“, service“); } catch (Exception ex) {… RMI ETIS SS05 Nadine Fröhlich 10 Helper generieren, RMIRegistry + Service starten • rmic (RMI Compiler) generiert aus Serviceimplementierung Stub + Skeleton % rmic RemoteImpl • Rmiregistry starten % rmiregistry • Service starten % java KlasseInDerRegistrierung RMI ETIS SS05 Nadine Fröhlich 11 Clientaufruf • Client benötigt Stub, auf ihm werden Methoden aufgerufen • Client macht ein Lookup in RMIRegistry und sucht den Stub anhand des Namen IRemote service = (IRemote) Naming.lookup (“rmi://127.0.0.1/ServiceName“); 3. methodenAufruf() Clientobjekt Stub Serviceobjekt Skeleton 2. gefundener Stub 1. lookup() ServiceName HelloWorld StubService1 StubService2 Client heap RMI … … Server heap ETIS SS05 Nadine Fröhlich 12 Hintergrund: Proxy Pattern Client Subjekt operation() … EchtesSubjekt operation() … RMI Proxy echtesSubjekt operation() … … echtesSubjekt.operation(); … ETIS SS05 Nadine Fröhlich 13 Zusammenfassung • RMI verbirgt Tatsache, dass Methode remote (entfernt) aufgerufen wird – entfernte Methoden wie normale Methoden, in Client-JVM laufend, aufgerufen (mittels Stub (Proxy)) – RMI gibt Infrastruktur vor (inkl. lookup Service - nutzt Client zum Finden und Zugriff auf Remote-Objekte) – Netzwerk oder I/O Code nicht selber zu schreiben • Stub und Skeleton – kommunizieren über Protokoll Java Remote Method Protocol (JRMP) – oder IIOP (Internet Inter-ORB Protocol aus Corba) – generiert mit rmic – neuere Java Versionen erfordern kein explizites Skeleton-Objekt (Methoden dynamisch aufgerufen) RMI ETIS SS05 Nadine Fröhlich 14 Literatur • Gamma, E., Helm, R., Jonson, R., Vlissides, J., Entwurfsmuster, Addison-Wesley, Bonn, 1996 • Freeman, E., Freeman, E., Head First Design Patterns, O‘ Reilly, 2004 • Wutka, M. J2EE Developer‘s Guide, Markt+Technik, 2002 • http://www.dpunkt.de/java/Programmieren_mit_Java/Remote_ Method_Invocation/3.html RMI ETIS SS05 Nadine Fröhlich 15 Corba vs. RMI • CORBA: – Architektur für Kommunikation zwischen Anwendungen verschiedener Programmiersprachen (für die CORBA-Implementierung verfügbar) – Zusätzlicher Lernaufwand, da Server-Schnittstelle in Interface Definition Language (IDL) zu spezifizieren • RMI – speziell für Verwendung in Java konzipiert, d.h. kann nur dort verfügbare Features nutzen – konnte von Anfang an Objekte als Wert übergeben (über Objekt-Serialisierung) – mit J2SE verfügbar und kostenlos • Die Grenzen zwischen RMI und CORBA verschwimmen zunehmend, – RMI kann CORBA zugrunde liegendes IIOP-Protokoll zur Kommunikation nutzen – CORBA hat biete jetzt Mechanismus zur Übergabe von Objekten per Wert – Damit möglich, aus RMI Methoden in nicht in Java implementierten Objekten aufzurufen bzw. mit CORBA serverseitige RMI-Objekte anzusprechen. RMI ETIS SS05 Nadine Fröhlich 16