9. Remote Method Invocation Grundlagen der Programmierung II (Java) Prof. Dr. Bernhard Humm Hochschule Darmstadt – University of Applied Sciences Sommersemester 2006 Übersicht Grundlagen der Programmierung II Einordnung in den Kontext der Vorlesung Anwendungsentwicklung (Referenzarchitektur, Softwarekategorien) Anwendungs-Komponenten (Anwendungskern) Datenbankzugriff Graphische Benutzeroberflächen (Swing, JSF) Client- / Serverkommunikation (RMI) Berechtigungsverwaltung Application Server (EJB) Erweiterte Konzepte (Reflection, Threads, Design Patterns, …) Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 2 Agenda Agenda Prinzip Prinzip Beispiel Architektur-Überlegungen Literatur Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006. 13.6.2006 Seite 3 Prinzip Prinzipielle Arbeitsweise von RMI In einem Remote-Interface werden Methoden definiert, die als aufrufbare Dienste anderen Arbeitsplätzen zur Verfügung gestellt werden sollen Eine Serverklasse implementiert das Interface und erzeugt eine oder mehrere Instanzen (Remote-Objekte) Die Remote-Objekte werden bei einem Namens-Service registriert Clients beschaffen mit Hilfe der RMIRegistry Referenzen auf die benötigten Objekte und rufen die gewünschten Methoden auf. Der Rückgabewert wird an den Client zurückübertragen Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 4 Prinzip Stubs und Skeletons Ein Stub ist eine Klasse, die - wie das implementierende Remote-Objekt - das Remote-Interface implementiert und daher für den Client als Platzhalter für den Zugriff auf das Remote-Objekt dient Der Stub kommuniziert über eine TCPVerbindung mit dem Gegenstück auf der Server-Seite (Skeleton). Das Skeleton kennt das tatsächliche Applikationsobjekt, leitet die Anfragen des Stubs an dieses weiter und gibt den Rückgabewert an ihn zurück. Stub und Skeleton werden während der Entwicklung mit Hilfe eines Tools (rmic) generiert und verbergen die komplizierten Details der Kommunikation zwischen Server und Client Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 5 Prinzip Parameterübergabe Werden beim Aufruf einer Methode primitive Datentypen übergeben oder zurückgegeben (int, char, boolean, usw.), werden sie wie gewöhnlich per Wert übergeben (call by value – keinerlei Unterschied zu lokalen Java-Programmen) Lokale Objekte können dagegen nur dann als Parameter oder Rückgabewert verwendet werden, wenn sie serialisierbar sind. Sie werden bei der Übertragung kopiert und somit ebenfalls per Wert übergeben. Eigene Klassen müssen das Interface Serializable implementieren. Verweise auf Remote-Objekte, wie sie beispielsweise vom NamensService zurückgegeben werden, haben dagegen Referenzcharakter und werden wie gewöhnliche Objektreferenzen behandelt. Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 6 Prinzip Serialisierung - Deserialisierung Serialisierung: Speicherung von Objekten auf einen Stream Deserialisierung: Erzeugung von serialisierten Objekten Anwendungen: Speicherung in Dateien oder Datenbanken, Netzwerkkommunikation (zum Beispiel RMI) Serialisierung / Deserialisierung primitiver Typen (int, float, …): built-in Serialisierung / Deserialilsierung von Objekten: Interface Serializable implementieren Objekt muss Serializable implementieren Objekt ObjectOutputStream ObjectInputStream OutputStream InputStream Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 7 Agenda Agenda Prinzip Beispiel Beispiel Architektur-Überlegungen Literatur Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006. 13.6.2006 Seite 8 Beispiel Beispiel: TimeService getTime Client Server TimeService TimeService liefert die aktuelle Uhrzeit vom Server Durchzuführende Schritte: 1. Remote-Interface definieren 2. Remote-Interface implementieren 3. Stub und Skeleton erzeugen 4. Security-Policies festlegen 5. RMI-Repository starten 6. Remote-Objekte registrieren 7. Client implementieren und starten Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 9 Beispiel Remote-Interface definieren getTime liefert die aktuelle Uhrzeit als String vom Server Interface TimeService muss Interface java.rmi.Remote erweitern Alle Methoden müssen java.rmi.RemoteException werfen import java.rmi.*; public interface TimeService extends Remote { public String getTime() throws RemoteException; } Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 10 Beispiel Remote-Interface implementieren TimeServiceImpl wird von java.rmi.server.UnicastRemoteObjekt abgeleitet Verantwortlich für Details der Client / Server-Kommunikation import … public class TimeServiceImpl extends UnicastRemoteObject implements TimeService { … public String getTime() throws RemoteException { return (new Date()).toString(); } } Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 11 Beispiel Stub und Skeleton erzeugen Stub und Skeleton Klassen müssen erzeugt werden Generator-Tool rmic (Kommandozeilenprogramm aus dem JDK) erwartet den Namen der Implementierungsklasse als Argument (falls erforderlich, mit der vollen Paketbezeichnung) und erzeugt daraus die beiden Klassendateien für Stub und Skeleton Aus der Klasse TimeServiceImpl werden die Klassen TimeServiceImpl_Stub und TimeServiceImpl_Skel erzeugt und als .class-Dateien zur Verfügung gestellt > rmic TimeServiceImpl Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 12 Beispiel Security Policies festlegen TCP-Kommunikation mit der RMI-Registry auf Port 1099 ermöglichen Auf TCP-Port 80 eine Verbindung erlauben. Dort wird später der WebServer laufen, mit dem der Client die Klassendatei mit der TimeStoreImplementierung zur Verfügung stellt. Entsprechende Einträge in der benutzerspezifischen Policy-Datei vorzunehmen. Sie liegt im Home-Verzeichnis des aktuellen Benutzers und heißt .java.policy grant { permission java.net.SocketPermission "ph01:1099", "connect,resolve"; permission java.net.SocketPermission "ph02:80", "connect"; }; Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 13 Beispiel RMIRegistry starten RMIRegistry: Namensdienst für RMI Start der RMIRegistry als Kommandozeilenprogramm Standard-Portnummer: 1099 Starten unter Windows: > start rmiregistry Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 14 Beispiel Remote-Objekte registrieren Installation SecurityManager: aus Sicherheitsgründen notwendig, wenn mittels RMI Bytecode dynamisch geladen wird java.rmi.Naming: Klasse zum Speichern und Wiederfinden von Referenzen auf Remote-Objekte Methoden bind / rebind zum Speichern von Objektreferenzen URLs als Format für Referenzen: rmi://localhost:1099/TimeService System.setSecurityManager(new RMISecurityManager()); try { TimeServiceImpl tsi = new TimeServiceImpl(); Naming.rebind("TimeService", tsi); } catch (Exception e) { // error handling } TimeServiceRegistration. java > java -Djava.rmi.server.codebase=http://localhost/ TimeServiceRegistration Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 15 Beispiel Interface Naming public static void bind(String name, Remote obj) throws AlreadyBoundException, MalformedURLException, RemoteException public static void rebind(String name, Remote obj) throws RemoteException, MalformedURLException public static void unbind(String name) throws RemoteException, MalformedURLException, NotBoundException public static Remote lookup(String name) throws NotBoundException, MalformedURLException, RemoteException public static String[] list(String name) throws RemoteException, MalformedURLException Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 16 Beispiel Client implementieren und starten Auffinden des Remote-Objektes: Naming.lookup try { String url = "rmi://localhost:1099/TimeService“; TimeService ts = (TimeService) Naming.lookup(url); System.out.println(" Server time is " + ts.getTime()); } catch (Exception e) { // exception handling } TimeServiceClient. java WebServer unter Port 80 starten Start des Programms: > java TimeServiceClient Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 17 Agenda Agenda Prinzip Beispiel Architektur-Überlegungen Architektur-Überlegungen Literatur Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006. 13.6.2006 Seite 18 Architektur-Überlegungen Architektur-Betrachtung cd RMI Application code Technical code «interface» java.rmi.Remote «interface» ApplicationInterface «realize» «realize» «interface» RemoteInterface «realize» UnicastRemoteObject ApplicationClass «realize» use via delegation RemoteClass Die naive Implementierung mischt Anwendungscode und technischen Code Saubere Trennung: Anwendungsklasse und – Interface wissen nichts von Kommunikationstechnik RemoteInterface erbt von Anwendungs-Interface Remote-Klasse nutzt Anwendungsklasse (Delegation) Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 19 Agenda Agenda Prinzip Beispiel Architektur-Überlegungen Literatur Literatur Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006. 13.6.2006 Seite 20 Literatur Literatur und Referenzen Guido Krüger: Handbuch der Java-Programmierung, Kapitel 46 Remote Method Invocation Eclipse Plugin: http://www.genady.net/rmi/ Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 13.6.2006, Seite 21