Remote Method Invocation (RMI)



Ähnliche Dokumente
Anleitung. Ein einfaches RMI-Beispiel. (ab Java 5.0) c Y. Pfeifer. (Juni 2014)

Remote Method Invocation

Konzepte von Betriebssystem-Komponenten Middleware RMI

Java RMI Remote Method Invocation

Programmieren in Java

Java-Programmierung. Remote Method Invocation - RMI

Der lokale und verteilte Fall

Mobile und Verteilte Datenbanken

Einführung: Verteilte Systeme - Remote Method Invocation -

Remote Method Invocation

Musterlösung Übungsblatt 2 Netzprogrammierung WS 05/06

Themen. Web Service - Clients. Kommunikation zw. Web Services

Einführung in die Java- Programmierung

Vorkurs C++ Programmierung

Java: Vererbung. Teil 3: super()

Einführung in die Programmierung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Übungen zu Softwaretechnik

Objektorientierte Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Client/Server-Programmierung

Client/Server-Programmierung

VS Praktikum 03 Konzept

Mobile und Verteilte Datenbanken

Objektorientierte Programmierung für Anfänger am Beispiel PHP

How-to: Webserver NAT. Securepoint Security System Version 2007nx

Nutzung von GiS BasePac 8 im Netzwerk

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Szenario 3: Service mit erweiterter Schnittstelle

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Java Kurs für Anfänger Einheit 5 Methoden

4D Server v12 64-bit Version BETA VERSION

Java Virtual Machine (JVM) Bytecode

Programmieren II. Remote Method Invocation (RMI) Heusch -- Ratz. Institut für Angewandte Informatik

DOKUMENTATION VOGELZUCHT 2015 PLUS

Javakurs zu Informatik I. Henning Heitkötter

Lizenzen auschecken. Was ist zu tun?

5. Abstrakte Klassen. Beispiel (3) Abstrakte Klasse. Beispiel (2) Angenommen, wir wollen die folgende Klassenhierarchie implementieren:

Remote Method Invocation

Teamschool Installation/ Konvertierungsanleitung

Gemeinsamer Bibliotheksverbund: Übertragung von Datenexporten für den Verbundkatalog Öffentlicher Bibliotheken

Programmierkurs Java

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

Step by Step Webserver unter Windows Server von Christian Bartl

3 Objektorientierte Konzepte in Java

Step by Step Softwareverteilung unter Novell. von Christian Bartl

OP-LOG

Verwendung des IDS Backup Systems unter Windows 2000

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

IMAP Backup. Das Programm zum Sichern, Synchronisieren, Rücksichern und ansehen von gesicherten Mails. Hersteller: malu-soft

Step by Step Remotedesktopfreigabe unter Windows Server von Christian Bartl

Objektbasierte Entwicklung

Übung: Verwendung von Java-Threads

Powermanager Server- Client- Installation

Algorithmen und Datenstrukturen

Prinzipien Objektorientierter Programmierung

WebService in Java SE und EE

9. Remote Method Invocation Grundlagen der Programmierung II (Java)

Grundlagen von Python

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

5. Abstrakte Klassen

Datensicherung. Mögliche Vorgehensweisen:

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Eine Anleitung, wie Sie Mozilla Thunderbird 2 installieren und konfigurieren können. Installation Erstkonfiguration... 4

Proxyeinstellungen für Agenda-Anwendungen

Computeria Solothurn

Proxy. Krishna Tateneni Übersetzer: Stefan Winter

Windows Server 2012 R2 Essentials & Hyper-V

Installation und Inbetriebnahme von SolidWorks

Live Update (Auto Update)

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

ICS-Addin. Benutzerhandbuch. Version: 1.0

Web Services stellen eine Integrationsarchitektur dar, die die Kommunikation zwischen verschiedenen Anwendungen

Medea3 Print-Client (m3_print)

CORBA-Konzept. Ziele. Common Object Request Broker Architecture CORBA. Plattformunabhängige Kommunikation Transparente Verteilung von Objekten

Installation OMNIKEY 3121 USB

Benachrichtigungsmöglichkeiten in SMC 2.6

Über die Internetseite Hier werden unter Download/aktuelle Versionen die verschiedenen Module als zip-dateien bereitgestellt.

Print2CAD 2017, 8th Generation. Netzwerkversionen

Lokale Installation von DotNetNuke 4 ohne IIS

Große Übung Praktische Informatik 1

Tipps und Tricks zur Installation von Java-basierten Programmen auf Handys

Client-Server-Beziehungen

Bedienungsanleitung. Stand: Copyright 2011 by GEVITAS GmbH

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Konfiguration von Exchange 2000 zum versenden und empfangen von Mails & Lösung des SEND after POP Problems

SWT II Projekt. Chat - Anwendung. Pflichtenheft 2000 SWT

Software-Lizenzierung und Aktivierung: Verteilen von Software mit Apple Remote Desktop

Installieren Sie den Janaserver auf dem Schulserver oder dem Lehrerrechner.

System-Update Addendum

Transkript:

Remote Method Invocation (RMI) Hier soll ein Überblick 1 über die RMI-Technologie der Java 2 Plattform gegeben werden. Inhaltsverzeichnis 1.Überblick...3 2.RMI Architektur...6 2.1.Überblick...6 2.2.RMI Layer...8 3.Namensgebung...10 4.Beispielanwendung...11 4.1.Interface...11 4.2.Klassenimplementierung...12 4.3.Stub und Skeleton...14 4.4.Host Server...14 1 Basis: http://java.sun.com/developer/onlinetraining/rmi/rmi.html Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 1/25

4.5.Client...15 4.6.Installation und Start...17 5.Parameter und Ergebnisse von RMI...19 6.Verteilung und Installation von RMI Software...24 Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 2/25

Überblick 1.Überblick Mit RMI ist es in Java möglich, Objektorientierte Verteilte Systeme zu entwickeln. Dabei ist die Idee die gleiche wie bei CORBA: der Zugriff auf Objekte von Clients aus auf Server, die die Objekte verwalten. Die Designer von RMI wollten es ermöglichen, dass der Java-Programmierer Objekte und Klassen verwenden kann, unabhängig von der JVM, die für die Verwaltung davon zuständig ist. Dazu muss eine Abbildung gefunden werden, die definiert, wie Objekte und Klassen auf unterschiedliche JVMen verlagert werden. Dazu ist erforderlich zu definieren, wie Objekte sich verhalten bzgl.: Instanziierung von Objekten, Fehlerbehandlung, Speicherverwaltung und Parameterübergabe. Daraus sind folgende Unterschiede zur Verwendung von lokalen Objekten entstanden: Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 3/25

Überblick Objekt Definition Objekt Implementierung Objekt Erzeugung Objekt Zugriff Referenzen lokales Objekt Ein lokales Objekt ist definiert durch eine Java Klasse Ein lokales Objekt ist implementiert durch eine Java Klasse Eine neue Instanz eines lokalen Objektes wird durch den new-operator erzeugt. Auf ein lokales Objekt wird direkt über eine Referenzvariable zugegriffen. In einer einzigen JVM zeigt eine Referenz immer auf das Objekt im Heap. entferntes Objekt Das Verhalten eines entfernten Objektes ist definiert durch ein Interface, das vom Interface Remote abgeleitet ist. Das Verhalten eines entfernten Objektes ist implementiert durch eine Klasse, die die remote-schnittstelle implementiert. Eine neue Instanz eines entfernten Objektes wird auf dem Server mit new erzeugt. Ein Client kann ein entferntes Objekt nicht direkt erzeugen. (Ausnahme: Java2 Remote Objekt Activation) Auf ein remote Objekt wird über eine Referenzvariable zugegriffen, die auf eine Proxystub Implementierung des remote Interface zeigt. Eine Remotereferenz ist ein Zeiger auf ein Proxyobjekt (Stub) im lokalen Heap. Dieser Stub enthält die Informationen, wie auf das Remoteobjekt im Heap der entfernten JVM zugegriffen werden kann. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 4/25

Überblick Aktive Referenzen Finalizer Ausnahmen lokales Objekt In einer einzigen JVM ist ein Objekt so lange am leben, wie es eine Referenz auf es gibt. Wenn ein Objekt eine finalizer Methode hat, wird sie aufgerufen, bevor der Garbage Collector aktiv wird. Der Java Compiler verlangt, dass alle Exceptions abgefangen werden. entferntes Objekt In einer verteilen Java Umgebung kann eine entfernte JVM abstürzen oder die Netzverbindung kann unterbrochen sein. Ein Remoteobjekt wird als aktiv angesehen, wenn eine Remotereferenz existiert und ein Zugriff darüber innerhalb einer gewissen Zeit (lease period) stattgefunden hat. Wenn alle Remotereferenzen explizit gelöscht wurden oder für alle die lease period abgelaufen ist, wird das Objekt dem Garbage Collector zugänglich gemacht. Hat ein remote Objekt ein unreferenced Interface, wird die unreferenced Methode der Schnittstelle aufgerufen, bevor der remote Garbage Collector aktiv wird. RMI verlangt, dass alle RemoteException abgefangen werden. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 5/25

RMI Architektur 2.RMI Architektur Das Grundprinzip von RMI ist die Trennung von der Definition des Verhaltens eines entfernten Objektes und dessen Implementierung. 2.1.Überblick Die Definition eines Remoteservice wird durch ein Java Interface programmiert; die Implementierung wird serverseitig durch eine Java Klasse realisiert. Client Server Interface Implementierung RMI Infrastruktur Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 6/25

RMI Architektur In Java enthält ein Interface keinen ausführbaren Kode. Deshalb stellt RMI zwei Klassen bereit, die das selbe Interface implementieren; eine Klasse mit dem Verhalten, die auf dem Server läuft; die andere läuft als Proxy für den Remoteservice auf dem Client: Interface Service Client Server Service Proxy RMI Service Implementierung Der Client macht einen Aufruf einer Methode des Proxyobjektes, RMI sendet die Anfrage an die JVM des Server, wo das Serviceobjekt die Anfrage ausführt und das Ergebnis zurücksendet. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 7/25

RMI Architektur 2.2.RMI Layer Die Realisierung der RMI Architektur basiert auf einem Ebenenkonzept mit 3 Layern: Client Programm Server Programm Stubs & Skeletons Remote Reference Layer Stubs & Skeletons Remote Reference Layer RMI Infrastruktur Damit kann jeder Layer geändert werden, ohne das Gesamtsystem ändern zu müssen. So kann z.b. der Transport Layer auf UDP/IP erweitert werden, ohne Änderungen am Rest vornehmen zu müssen. Stub und Skeleton Layern Transport Layer Dieser Layer bildet die Schnittstelle zum Programmierer: er interpretiert Methodenaufrufe des Client von Interface Referenzvariablen und leitet sie an den Remote Referenz Layer weiter. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 8/25

RMI Architektur Remote Referenz Layer Hier wird die Verbindung von Referenzvariablen zu Remote Service Objekten hergestellt. Transport Layer Der Transport Layer ist zuständig für die Verbindungen von einer JVM zu einer anderen. Alle diese Verbindungen sind stream-orientierte TCP/IP Netzverbindungen. Dies gilt auch, wenn zwei JVMen auf dem selben Rechner laufen. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 9/25

Namensgebung 3.Namensgebung RMI nutzt einen Nameservice, der vom Client benutzt wird, um das Remoteobjekt finden zu können. Der Nameservice, der zu einem RMI System gehört, ist rmiregistry, der auf jedem Rechner laufen muss, auf dem ein RMI Server ein Objekt verwaltet. Der Defaultport, der dazu verwendet wird ist 1099. Wenn ein Serverprogramm gestartet wird und ein RMI Objekt erzeugt wird, wird es beim RMI System registriert und ein Listening-Service gestartet, der auf Verbindung zu dem Objekt wartet. Der Client benutzt die Methode lockup() der Klasse Naming, um die RMI Registry nach einem Objektes abzufragen. In lockup() wird eine URL angegeben, um den Server und den Service zu spezifizieren: rmi:://<host>[:<port>]/<service> Die Portangabe ist nur erforderlich, wenn nicht der Defaultport 1099 verwendet wird. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 10/25

Beispielanwendung 4.Beispielanwendung Im folgenden wird als Beispiel ein einfacher Taschenrechner (wie bei RPC) programmiert. Dabei stellt eine Server das Objekt für den Rechner bereit. Ein Client verwendet das Remoteobjekt, um rechnen zu können. Die prinzipielle Vorgehensweise beim Realisieren einer RMI-Anwendung ist wie folgt: 1.Programmieren des Javakodes für das Interface 2.Programmieren des Javakodes für die Implementierung der Klassen 3.Generieren der Sup und Skeleton Dateien aus der Implementierung der Klassen 4.Programmieren des Remote Service des Hostprogramms 5.Programmieren des Clientprogramms 6.Installation und Starten des RMI Systems 4.1.Interface Das Interface Calculator beschreibt die Eigenschaften des Remote Service: Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 11/25

Beispielanwendung $ cat Calculator.java public interface Calculator extends java.rmi.remote { public long add(long a, long b) throws java.rmi.remoteexception; public long sub(long a, long b) throws java.rmi.remoteexception; public long mul(long a, long b) throws java.rmi.remoteexception; public long div(long a, long b) throws java.rmi.remoteexception; $ $ javac Calculator.java $ dadurch wird es ein Remote Interface dadurch wird eine Remote Exception erzeugt 4.2.Klassenimplementierung Jetzt wird die Implementierung des Remote Service realisiert als Klasse CalculatorImpl: Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 12/25

Beispielanwendung $ cat CalculatorImpl.java public class CalculatorImpl extends java.rmi.server.unicastremoteobject implements Calculator { $ // Implementations must have an explicit constructor // in order to declare the RemoteException exception public CalculatorImpl() throws java.rmi.remoteexception { super(); public long add(long a, long b) throws java.rmi.remoteexception { return a + b; public long sub(long a, long b) throws java.rmi.remoteexception { return a - b; public long mul(long a, long b) throws java.rmi.remoteexception { return a * b; public long div(long a, long b) throws java.rmi.remoteexception { return a / b; Durch den expliziten Konstruktor wird wegen super() die Objektinitialisierung auf dem Server durch den Kode von UnicastRemoteObject ausgeführt. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 13/25

Beispielanwendung Jetzt ist die Realisierung der Server-Klasse fertig und man kann die Stubs und Skeletons erzeugen. 4.3.Stub und Skeleton Das Generieren der Stubs und Skeletons wird mit dem rmi Compiler vorgenommen: $ rmic CalculatorImpl $ ls -l *Sk* *St* -rw-r--r-- 1 as users 2260 4. Mär 12:40 CalculatorImpl_Skel.class -rw-r--r-- 1 as users 4450 4. Mär 12:40 CalculatorImpl_Stub.class $ rmic hat mehrere Optionen, u.a. auch eine, so dass die java Quellen der Stubs und Skeleton nicht automatisch gelöscht werden. $ rmic -? 4.4.Host Server Der Remote Service braucht noch ein Hauptprogramm (engl. service must be hosted ): Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 14/25

Beispielanwendung $ cat CalculatorServer.java import java.rmi.naming; public class CalculatorServer { public CalculatorServer() { try { Calculator c = new CalculatorImpl(); Naming.rebind("rmi://localhost:1099/CalculatorService", c); catch (Exception e) { System.out.println("Trouble: " + e); $ public static void main(string args[]) { new CalculatorServer(); 4.5.Client Der Client ist einfach: ein Remote Objekt wird erzeugt und verwendet. Der meiste Kode ist das Abfangen der Exception. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 15/25

Beispielanwendung $ cat CalculatorClient.java import java.rmi.naming; import java.rmi.remoteexception; import java.net.malformedurlexception; import java.rmi.notboundexception; public class CalculatorClient { public static void main(string[] args) { try { Calculator c = (Calculator) Naming.lookup("rmi://localhost/CalculatorService"); System.out.println( c.sub(4, 3) ); System.out.println( c.add(4, 5) ); System.out.println( c.mul(3, 6) ); System.out.println( c.div(9, 3) ); catch (MalformedURLException murle) { System.out.println(); System.out.println("MalformedURLException"); System.out.println(murle); catch (RemoteException re) { System.out.println(); System.out.println("RemoteException"); System.out.println(re); Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 16/25

Beispielanwendung $ catch (NotBoundException nbe) { System.out.println(); System.out.println("NotBoundException"); System.out.println(nbe); catch (java.lang.arithmeticexceptionae) { System.out.println(); System.out.println("java.lang.ArithmeticException"); System.out.println(ae); 4.6.Installation und Start Jetzt ist alles fertig und die Komponenten können gestartet werden: RMI Registry Server Client $ rmiregistry & [1] 9612 $ java CalculatorServer & Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 17/25

Beispielanwendung [2] 9623 $ java CalculatorClient 1 9 18 3 $ Was muss gemacht werden, damit Client und Server auf unterschiedlichen Rechnern laufen? Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 18/25

Parameter und Ergebnisse von RMI 5.Parameter und Ergebnisse von RMI Parameter werden in einer Single JVM Umgebung per call by value übergeben: bei einem Methodenaufruf wird vom aktuellen Parameterwert eine Kopie erzeugt und auf dem Stack abgelegt. Wird der Parameter innerhalb des Methodenrumpfes verwendet, so wird immer auf die Kopie auf dem Stack zugegriffen. Ergebnisse werden analog behandelt. Diese Mechanik wird sowohl für primitive Typen als auch für Objekte (über ihre Referenzvariable) verwendet. Dies verdeutlicht nochmals (zur Wiederholung) folgendes Javaprogramm: $ cat parameteruebergabe.java // Demonstriert call by value public class parameteruebergabe { public static class myint { public int value; public myint (int x) { value = x; Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 19/25

Parameter und Ergebnisse von RMI static void inc1(int x) { // einfacher Typ x++; System.out.println("in inc1 x="+x); static void inc2(myint x) { // Referenz x.value = x.value+1; // Wert wird geändert System.out.println("in inc2 x="+x.value); static void inc3(myint x) { // Referenz x = new myint(x.value+1); // x zeigt auf neues Objekt System.out.println("in inc3 x="+x.value); public static void main(string args[]) { int z=1; myint i= new myint(1); System.out.println("vor inc1 z=" + z); inc1(z); System.out.println("nach inc1 z=" + z); System.out.println(); Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 20/25

Parameter und Ergebnisse von RMI $ System.out.println("vor inc2 i=" + i.value); inc2(i); System.out.println("nach inc2 i=" + i.value); System.out.println(); System.out.println("vor inc3 i=" + i.value); inc3(i); System.out.println("nach inc3 i=" + i.value); Was wird ausgegeben? Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 21/25

Parameter und Ergebnisse von RMI Innerhalb einer RMI Umgebung wird diese Mechanik nur für primitive Typen verwendet: Wird ein primitiver Typ als Parameter einer Remote-Methode verwendet, so wird die lokale JVM eine Kopie des Wertes erstellen und an die Remote JVM senden (Ergebnisse analog). Objekte in einer RMI Umgebung werden anders behandelt: Wird ein Objekt als Parameter einer Remote-Methode verwendet, so sendet die lokale JVM das Objekt (nicht die Referenz) an die Remote JVM (Ergebnis analog). Die ist notwendig, das ja die Remote JVM mit der lokalen Referenz nichts anfangen könnte. Kompliziert wird es, wenn ein Objekt Referenzen auf andere Objekte enthält (graphartige Objektstruktur). Dann muss die lokale JVM das Objekt serialisieren zum die Remote JVM muss es deserialisieren, d.h. die Struktur wieder in seinem Heap aufbauen. Die kann bei grossen Objekten langsam werden, deshalb gilt bei RMI Anwendungen (wie bei CORBA): besser mehrere kleine selbstbeschreibende Klassen und immer nur das notwendige als Parameter mitgeben, als alles in eine komplexe Klasse packen und die dann verwenden. Eine dritte Möglichkeit bilden in RMI Systemen die Remote Objekt Parameter. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 22/25

Parameter und Ergebnisse von RMI Normalerweise verwendet ein Client die RMI Registry, um eine Remote Referenz zu erhalten. Ein Remote Methodenaufruf kann aber selbst eine solche Referenz zurück liefern, die dann vom Client weiter verwendet werden kann. Im folgende Beispiel stellt ein Service (BankManager) eine Methode (getaccount()) zur Verfügung, die eine Referenz auf ein Remote Objekt zurück liefert: BankManager bm; Account a; try { bm = (BankManager) Naming.lookup("rmi://BankServer/BankManagerService"); a = bm.getaccount( "jguru" ); // Code that uses the account catch (RemoteException re) { In der Implementierung von getacount wird eine (lokale) Referenz auf das remote Objekt zurück geliefert: public Account getaccount(string accountname) { // Code to find the matching account AccountImpl ai = // return reference from search return ai; Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 23/25

Verteilung und Installation von RMI Software 6.Verteilung und Installation von RMI Software Um ein RMI zu installieren, müssen die Klassen-Files von Client und Server aus erreichbar sein. Der Classloader des Server benötigt folgende Class Files: Remote Service Interface Definition Remote Service Implementierung Stubs und Skeletons Server Klassen der Anwendung Der Classloader des Client benötigt folgende Class Files: Remote Service Interface Definition Stubs und Skeletons Server Klassen von Objekten, die der Client verwendet Client Klassen der Anwendung Diese Klassen können entweder händisch auf Client und Server kopiert werden, oder aber von einem zentralen Server geladen werden. Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 24/25

Verteilung und Installation von RMI Software Dazu wird bei grossen Anwendungen meist ein eigener Bottstrap Loader für Clients und Server programmiert. (vgl. http://java.sun.com/developer/onlinetraining/rmi/exercises/bootstrapexample/index.html) Verteilte Systeme: RMI.sxw Prof. Dr. Alois Schütte 25/25