ETH Zürich, SS2001 Programmieren wie mit lokalen Objekten wenig Programmier-Overhead verteilte Applikationen • • • Java RMI Aufruf einer Methode eines “remote”-Objektes Zweck: • • Analogon zum RPC (Remote Procedure Call) • Objekte in verschiedenen Java-VM’s Ausführung der Methoden auf einem entfernten Rechner • • spezielle Technik aus dem Java-Umfeld • Remote Method Invocation Seite 1 ETH Zürich, SS2001 Client Stub lookup 2 4 result Java RMI 3 1 Server (re)bind Namensdienst Skeleton Server-Seite call Client-Seite Netzwerk RMI-Architektur ( I ) Seite 2 Server-Seite: • Client-Seite: ETH Zürich, SS2001 Java RMI //Referenz (Stub) des entfernten Objektes bekommen rmi.Naming.lookup(“rmi://some.server.com/ObjectName“) • //entfernte Objekt abmelden rmi.Naming.unbind(“ObjectName“, RemoteObject) //entfernte Objekt anmelden rmi.Naming.bind(“ObjectName“, RemoteObject) Namensdienst wird ganz am Anfang gestartet • RMI-Architektur ( II ) Seite 3 besitzt auch nicht remote-aufrufbare Methoden (nicht exportiert) ist mit einem Ort assoziiert • • muß exportierte Methoden kennen • Java RMI muß Klasse des Servers kennen • ETH Zürich, SS2001 muß Ort des Servers kennen • Client: muß Methoden nach außen verfügbar machen (exportieren) • Server: RMI Probleme Seite 4 Schritt 7: Client starten • ETH Zürich, SS2001 Schritt 6: Server starten Java RMI - Starten der Namensdienst mit rmiregistry Schritt 4: Namensdienst aktivieren - Methoden-Aufruf wie auf dem lokalen Objekt - Anfrage im Repository nach dem entfernten Server Schritt 3: Client-Seite Implementieren - automatische Generierung mittels rmic Schritt 2: Stub und Skeleton generieren - Server Implementation - Basis Interface Schritt 1: Implementierung der Server-Seite • • • • • RMI-Benutzung Seite 5 Punkt-zu-Punkt Kommunikation, Garbage-Collection ermöglicht das Weiterleiten der eventuellen Fehlermeldungen ETH Zürich, SS2001 Java RMI public ServerImpl throws RemoteException { super(); } public do_something() { ... } public static void main (String args[]){ try { ServerImpl server=new ServerImpl(); Naming.rebind(“MyServer“, server); } catch (Exception e){ e.printStackTrace; } } } Hier wird die entfernt aufrufbare Methode implementiert ermöglicht entfernter Zugriff auf die im Basis-Interface aufgelistete Methoden public class ServerImpl extends UnicastRemoteObject implements Server { import java.rmi.*; import java.rmi.server.*; Implementation des Server-Objektes interface Server extends Remote { public void do_something() throws java.rmi.RemoteException } Deklaration der entfernt zugreifbaren Methoden in einem Basis-Interface RMI-Beispiel ( I ) - Der Server Seite 6 ETH Zürich, SS2001 MyServer Java RMI implements MyServerInterface java.rmi.UnicastRemoteObject extends java.rmi.Remote Interfaces java.rmi.RemoteObject Klassen RMI Klassen und Interfaces Seite 7 Java RMI ServerImpl_Skel.class - Skeleton für die Server-Seite ServerImpl_Stub.class - Stub für die Client-Seite Dabei entstehen folgende Klassen: ETH Zürich, SS2001 • Für automatische Erzeugung wird Tool rmic verwendet • >rmic ServerImpl ServerImpl.java compilieren • Klassen Stub und Skeleton werden automatisch wie folgt erzeugt: RMI-Beispiel ( II ) - Stub und Skeleton Seite 8 spezielles Tool rmiregistry: • Seite 9 Fehlermeldung falls Port bereits von einem anderen Prozess verwendet wird • Java RMI Portnummer ist ein optionaler Parameter (per Definition wird 1099 eingestellt). • ETH Zürich, SS2001 Namensdienst wird gestartet • > rmiregistry <port> & Verzeichnis der zur Verfügung gestellten entfernten Objekte • RMI-Beispiel ( III ) - Namensdienst } } Java RMI Server server=(Server) Naming.lookup(“rmi://some.server.com/MyServer“); server.do_something(); } catch (RemoteException e){ System.out.println(e) } try{ public static void main (String args[]) { public class ClientImpl { import java.rmi.*; Seite 10 keine zusätzliche Vererbung von Interfaces und Objektklassen nötig Client findet den Server, indem er sich an den Namensdienst in dem ServerRechner wendet bei Implementation assoziierter Name wird für die Nachfrage benutzt ETH Zürich, SS2001 • • • RMI-Beispiel ( IV ) - Der Client enthält Referenzen auf Remote-Objekte Referenzen über Namen identifizierbar Namen sind wie URL’s zusammengesetzt Naming-Methoden: • • • • ETH Zürich, SS2001 Katalog von verfügbaren Remote-Objekten • Java RMI • Remote lookup(String url) • String[] list(String url) • void unbind(String url) Seite 11 rmi://host.domain/objectname • void rebind(String url, Remote reference) • void bind(String url, Remote reference) java.rmi.Naming - Service • Remote-Objekte müssen erreichbar sein: RMI-Naming aber: neue Fehlerquellen + Exceptions (fast) gleiche Behandlung von lokalen und Remote-Objekten Remote-Objekt fungiert als Server (exportiert Methoden) Client kann über ein Interface auf das Remote-Objekt zugreifen RMI-Paket bietet einfachen Naming-Service Parallele Ausführung von Methodenaufrufen im Server mittels Threads (erfordert Synchronisation!) • • • • • • Java RMI vereinfacht das Programmieren • ETH Zürich, SS2001 RMI bietet Methode zum Verstecken von Verteilung • Zusammenfassung Seite 12