Remote Methode Invocation (RMI) ETIS SS05
Gliederung Motivation Ablauf der Kommunikation Erstellung Remote-Service Zusammenfassung RMI ETIS SS05 Nadine Fröhlich
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 Java-Anwendungen eingesetzt Client und Server in Java programmiert Seit JDK 1.1 Bestandteil der Standardbibliotheken von Java, d.h. auf allen Plattformen nutzbar, auf denen Java-Laufzeitumgebung verfügbar RMI ETIS SS05 Nadine Fröhlich
Motivation I Problem: Aufruf eines (Service) Objektes in entfernter JVM nötig (auf selben oder entfernten Rechner) 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 ? Client- objekt Service- objekt ? Client heap Server heap RMI ETIS SS05 Nadine Fröhlich
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() 3. MethodenAufruf() 2. Informationen zum Methodenaufruf Client- objekt Client- helper Service- helper Service- objekt 5. Übermitteln gepacktes Ergebnis 6. Ergebnis an Client 4. Ergebnisrückgabe Client heap Server heap RMI ETIS SS05 Nadine Fröhlich
Ablauf der Kommunikation II 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
Ablauf der Kommunikation III Methodenaufruf Service Helper (Skeleton) nimmt Anfrage entgegen und ruft wirkliche Methoden auf richtigem Service-Objekt auf Ergebnisrückgabe Service Helper bekommt Rückgabewert vom Service-Objekt Übermitteln gepacktes Ergebnis Service Helper packt + verschickt Ergebnis an Client-Helper Ergebnis an Client Client-Helper entpackt Informationen und gibt Werte an Client Objekt zurück RMI ETIS SS05 Nadine Fröhlich
Erstellung Remote-Service Remote-Interface erstellen Remote Interface definiert Methoden, die Client entfernt aufrufen kann Stub und Service implementieren es Remote Implementierung erstellen Implementierung macht eigentliche Arbeit (Service) Stub (Client Helper) + Skeleton (Service Helper) generieren automatisch aus Implementierung mit rmic generiert RMI Registry starten Wie Telefonbuch, hier erfragt Client den Stub Remote Service starten Service instanziert + in Registry registriert, dadurch ist er für Clients verfügbar RMI ETIS SS05 Nadine Fröhlich
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
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
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
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() Client- objekt Service- objekt Stub Skeleton 2. gefundener Stub 1. lookup() ServiceName HelloWorld … StubService1 StubService2 … Client heap Server heap RMI ETIS SS05 Nadine Fröhlich
Hintergrund: Proxy Pattern Client Subjekt operation() … EchtesSubjekt Proxy … echtesSubjekt.operation(); operation() … echtesSubjekt operation() … RMI ETIS SS05 Nadine Fröhlich
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
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
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