Vs8.1.5 1 8.1.5 Java RMI – Remote Method Invocation (http://java.sun.com/products/jdk/rmi )http://java.sun.com/products/jdk/rmi (http://java.sun.com/j2se/1.5/docs/guide/rmi.

Slides:



Advertisements
Ähnliche Präsentationen
Strategie (Strategy / Policy) Ein objektbasiertes Verhaltensmuster Stephan Munkelt, Stefan Salzmann - 03IN.
Advertisements

DVG Dateien Dateien. DVG Dateien 2 Die Klasse File Die Klasse File stellt die Verbindung zwischen dem Filesystem des Rechners und dem.
Einführung in die Programmierung Zusammenfassung
DI Christian Donner cd (at) donners.com
Tomcat Web-Server installieren
Internetzugriff mit Strings und Streams
Ausnahmen HS Merseburg (FH) WS 06/07.
Threads Richard Göbel.
Java: Dynamische Datentypen
Indirekte Adressierung
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
Java: Grundlagen der Sprache
Java: Referenzen und Zeichenketten
Ein Beispiel in Java.
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
Benötigte Applets Startseite: in HTML-Format Applet auf der Startseite Das Applet, das auf der Startseite geladen wird, wird die vier Buttons und die eine.
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: Benutztes Objekt kennt den Kontext seiner Nutzung nicht. Daher kann es in besonderen Situationen keine Entscheidung.
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Ausblick Es fehlen noch: Möglichkeiten zum Strukturieren größerer Programme Umgang mit variabler Zahl von Elementen Umgang mit.
PKJ 2005/1 Stefan Dissmann Zusammenfassung Bisher im Kurs erarbeitete Konzepte(1): Umgang mit einfachen Datentypen Umgang mit Feldern Umgang mit Referenzen.
JAVA RMI.
Remote Methode Invocation (RMI)
Packages Vortrag : Cornelia Hardt 23. November 1999.
DVG1 - Applets1 Applets. DVG1 - Applets2 Die Klasse Applet n Applets sind Grafikobjekte, die unter Steuerung eines anderen Programms (z.B. eines Browsers,
DVG Kommentare1 Kommentare. DVG Kommentare 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht.
DVG Interfaces. DVG mehrfache Vererbung 4 Mehrfache Vererbung ist die Ableitung einer Klassen von mehreren anderen Klassen. –farbigerPunkt.
DVG Einführung in Java1 Einführung in JAVA.
Abstrakte Klassen, Interface
DVG Klassen und Objekte
DVG Kommentare 1 Kommentare. 2 Kommentare Es gibt zwei Arten von Kommentaren: einzeilige Kommentare // der Kommentar geht bis zum Ende der Zeile.
Java in 9 Folien Besser: Online-Buch Go to Java 2.
© 2005 Pohlig - Taulien Datenströme GK Informatik 1 Datenströme.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Was umfaßt die CORBA Core Spezifikation? Welche zusätzlichen Komponenten muß ein ORB Produkt beinhalten? Core: CORBA Objekt Modell CORBA Architektur OMG.
Wir bauen uns eine Webapplikation!
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
7.1.5 Java RMI – Remote Method Invocation
EPROG Tutorium #6 Philipp Effenberger
EPROG Tutorium #5 Philipp Effenberger
Learning By Doing Parallelverarbeitung Multithreading (Nebenläufigkeit) Alte Idee der Parallelverarbeitung statt rein sequentieller Prozesse Parallelverarbeitung.
Parallele Programmierung in Java
Javelin Internet-based parallel computing using Java.
Voyager Eigenschaften/Vorzüge Universalität: –ROI-Modelle: CORBA, RMI, DCOM –verschiedene Namens-, Verzeichnisdienste Nachrichtentypen: synchron, oneway,
Vs Grundzüge der Fernaufruf-Implementierung = tatsächliche Aufrufbeziehungen Netz Fernaufrufdienst Transportdienst Hardware BS aus Bibl. Vertreter.
7.2.4 Klassifikation mobilen Codes Nicht vergessen:  Sowohl das Fernkopieren als auch die Migration von Objekten setzt voraus, daß der Code entweder am.
Java-Applets und URLs APP Philip Graf, Andreas Bößl.
Middleware in Java vieweg 2005 © Steffen Heinzl, Markus Mathes Kapitel 6: Verteilte Objekte durch RMI.
Java-Kurs Übung Besprechung der Hausaufgabe
NET Remoting.Net („dotnet“) :von Microsoft eingeführte Plattform für verteilte Anwendungen, virtuelle Maschine für die verteilte Ausführung von.
MD 4/02 CORBA Static/Dynamic Invocation Interface (SII/DII), Interface Repository.
Abteilung für Telekooperation Softwareentwicklung 2 UE WS 2008/09 SE2UE_ Ausnahmen (Exceptions)
Reflection API1 Motivation Reflection API Core Reflection API: java.lang.reflect Seit JDK 1.1 integraler Bestandteil der Java- Klassenbibliothek Ermöglicht:
2.6 Erinnerung: Programmverwaltung Quellencode (getrennt übersetzbare Programmteile) (source code) Übersetzer (compiler, assembler) Objektcode
Realisierung verteilter Anwendungen: Teil 2 zInhalt heute: yKommunikation über Sockets yJava Remote Method Invocation, RMI zLernziele: yVerständnis eines.
Java Programme nur ein bisschen objektorientiert.
1 vs NET Remoting.Net („dotnet“) :von Microsoft eingeführte Plattform für verteilte Anwendungen, virtuelle Maschine für die verteilte Ausführung.
(mobile objects, auch Objektmigration, object migration)
Vererbung.
„Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen.“
OOP II.
Java-Kurs Übung Klassen und Objekte: Vererbung (Fortsetzung)
Dynamisches Laden von Klassen
Raphael Fischer Informatik II - Übung 06 Raphael Fischer
Es gibt Klassen, die mit der Entwicklungsumgebung ausgeliefert werden
Ein Referat von Sabrina Vissel, darleen paul und yannick fuchs
1. Die rekursive Datenstruktur Liste 1
Tutorstunde 10.
Implementieren von Klassen
 Präsentation transkript:

vs Java RMI – Remote Method Invocation ( ) ( ) ( ) ( ) Unterstützung von Fernaufrufen durch Bibliothekspakete java.rmi java.rmi.server java.rmi.registry und weitere... RMI bietet leider nur begrenzte Verteilungsabstraktion.

vs  interface Remote Für ein fernaufrufbares Objekt und sein Vertreterobjekt muss eine gemeinsame Schnittstelle definiert werden, die von java.rmi.Remote erben muss, z.B. import java.rmi.*; interface RemoteService extends Remote { String echo(String s) throws RemoteException; } Spätere Vertretererzeugung gelingt nur dann, wenn die Ausnahme java.rmi.RemoteException vereinbart wird Grundzüge der Fernaufruf-Programmierung in Java

vs  class UnicastRemoteObject Klasse eines fernaufrufbaren Objekts muss von java.rmi.server.UnicastRemoteObject erben, z.B. import java.rmi.*; import java.rmi.server.*; class Server extends UnicastRemoteObject implements RemoteService { public Server() throws RemoteException { } nötig! private String memory = ""; public String echo(String s) // throws entbehrlich! { return memory += s; } } UnicastRemoteObject redefiniert die Operationen von Object (z.B. equals() für Fernvergleich) und registriert das fernaufrufbare Objekt bei der RMI-Verwaltung (≈ Adapter). Achtung: Ein Server -Objekt kann durchaus auch lokal benutzt werden.

vs  class Naming: Namensdienst ist über statische Operationen der Klasse java.rmi.Naming erreichbar: public static void rebind(String name, Remote object) throws RemoteException, MalformedURLException // java.net public static Remote lookup(String name) throws NotBoundException, RemoteException, MalformedURLException (weitere Operationen: bind, unbind, list )

vs Der Parameter String name ist im URL-Format anzugeben – er identifiziert Station und Port des Namensdienstes und enthält den eigentlichen Objektnamen: [ // host [ : port ] / ] name Adresse des Namensdienstes Standard-Host = lokale Station Standard-Port = 1099 Ein Namensdienst wird (unter Unix) gestartet mit rmiregistry [ port ] & (und sollte – wenn nicht mehr benötigt – mit kill beendet werden) Achtung: Einträge verändern nur lokal, aber abfragen auch entfernt !

vs Anbieterseitig: Server -Objekt erzeugen und beim (lokalen) Namensdienst registrieren: Naming.rebind("Service", new Server()); Casting erforderlich! Es wird geprüft, ob das von lookup gelieferte Vertreterobjekt tatsächlich die benötigte Schnittstelle implementiert. Klientenseitig: Klient erfragt Objekt beim Namensdienst: RemoteService s = (RemoteService)Naming.lookup("//obelix/Service"); System.out.println(s.echo("bla"); Aufsetzten und Verwendung

vs Vertretererzeugung und -installation (< JDK 1.5) Vertretergenerator heißt RMI Compiler und wird aufgerufen mit rmic also z.B. rmic Server ( - nicht mit Schnittstelle RemoteService !) und generiert Stubs – bereits als.class -Dateien EingabeAusgabe Server_Stub.class (Vertreter) Server.class Server_Skel.class ( Treiber)

vs Installation der.class -Dateien: CLASSPATH geeignet setzen!  Beim Erzeugen des fernaufrufbaren Objekts muss der zugehörige Treiber-Code greifbar sein.  Beim Registrieren des fernaufrufbaren Objekts beim Namensdienst muss auch der zugehörige Vertreter-Code greifbar sein - ferner: codebase wird dem Namensdienst zur späteren Weitergabe mitgeteilt (s.u.  ).  Beim Erzeugen des Vertreter-Objekts beim Klienten – als Folge der Anfrage beim Namensdienst – muss dort der Vertreter-Code greifbar sein. (Alternative: Namensdienst liefert codebase des Vertreter-Objekts – Security Manager muss das Herunterladen erlauben; vgl )

vs Von der Programmierung bis zur verteilten Ausführung // RemoteService.java – sowohl für Client als auch Server interface RemoteService extends Remote { String echo(String s) throws RemoteException; } // Server.java class Server extends UnicastRemoteObject implements RemoteService { public Server() throws RemoteException { } private String memory = ""; public String echo(String s) { return memory += s+" "; } public static void main(String[] arg) throws Exception { Naming.rebind("Service", new Server()); // Programm stoppt hier nicht – wegen verborgener RMI Threads }

vs Übersetzen auf Server-Maschine obelix : javac RemoteService.java liefert RemoteService.class javac Server.java liefert Server.class Erzeugung der Stubs (optional*): rmic Server liefert Server_Stub.class Server_Skel.class Namensdienst einrichten (falls nicht schon vorhanden): rmiregistry & Server starten (er registriert sich selbst beim Namensdienst): java Server &

vs … und hier ein Beispiel-Klient: // Client.java, benötigt RemoteService.java class Client { public static void main(String[] arg) throws Exception { RemoteService s = (RemoteService)Naming.lookup("//"+arg[0]+"/Service"); System.out.println(s.echo(arg[1])+"\n"); System.exit(0); } Damit das Programm nicht Fernaufrufe wegen der RMI Threads hängenbleibt

vs Übersetzen auf irgendeiner Klienten-Maschine: javac RemoteService.java javac Client.java Vertreter-Code bereitstellen, Server_Stub.class, über Netzdateisystem oder Dateiübertragung von Server-Maschine obelix Klient z.B. wiederholt starten: > java Client obelix hallo hallo > java Client obelix hallo hallo > java Client obelix hallo hallo hallo hallo

vs Alternatives Szenario mit separater Entwickler-Station: Entwickler-StationKlienten-StationAnbieter-Station > javac RemoteService.java > javac Server.java > javac Client.java > rmic Server RemoteService.class RemoteService.class RemoteService.classServer.class Client.class Server_Stub.classServer_Stub.class Server_Stub.classServer_Skel.class > rmiregistry & > java Server & > java Client elfe bla bla >

vs Mit JDK 1.5 wird der Generator rmic nicht mehr unbedingt benötigt. Stattdessen kommt Java Reflection zum Einsatz. Zur Erinnerung: // Dynamischer Aufruf Class[] types = { String.class, Integer.class }; Method method = MyClass.getDeclaredMethod("myMethod", types); Object[] args = { "Hallo", new Integer(42) }; method.invoke(obj, args); // Dynamischer Proxy public interface Foo { public void bar(); } public class MyHandler implements InvocationHandler { public Object invoke(Object proxy, Method method, Object[] args) { if (method.getName().equals("bar"))... } }; Class[] interfaces = { Foo.class }; Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), interfaces, handler); f.bar(); // -> handler.invoke(...)

vs Verweise in Fernaufruf-Parametern Übergeben wird entweder Vertreter oder Kopie des Objekts:  Schnittstelle des formalen Parameters erbt von Remote : aktueller Parameter muss (statisch) gleiche Schnittstelle implementieren, (dynamisch) von UnicastRemoteObject erben, andernfalls MarshalingException  Netzverweis/Vertreterobjekt wird übergeben

vs  Schnittstelle des formalen Parameters erbt nicht von Remote : aktueller Parameter muss (statisch) gleiche Schnittstelle implementieren, (dynamisch) Schnittstelle java.io.Serializable implementieren, andernfalls MarshalingException  Objektkopie wird übergeben In Objekte eingebettete Verweise werden entsprechend behandelt ! Felder (arrays) und Zeichenketten (strings) sind serializable !

vs Achtung! Wenn ein formaler Parameter einen Schnittstellentyp hat, kennt man vom aktuellen Parameter nur diese Schnittstelle (unabhängig davon, ob es sich um einem lokalen oder einen Fernaufruf handelt). ● Wird ein fernaufrufbares UnicastRemoteObject übergeben, so weiß man nicht, ob das Objekt tatsächlich entfernt oder aber lokal vorliegt. ● Handelt es sich um ein serialisierbares Objekt, so wird in Abhängigkeit von seiner Lage entweder eine Kopie oder das Objekt selbst geliefert!  Die Semantik des Aufrufs ist nicht eindeutig bestimmt ! (siehe dazu auch Brose/Löhr/Spiegel: Java resists transparent distribution)Java resists transparent distribution

vs Aktivierbare Objekte werden erst bei Bedarf erzeugt – allerdings nach vorangegangener Registrierung über den RMI Daemon rmid import java.rmi.activation.*; class Server extends Activatable implements RemoteService { public Server(ActivationID id, MarshalledObject data) throws RemoteException { super(id, 0); } } Server.class muss bei rmid, die zugehörige Vertreterklasse beim Namensdienst registriert werden – dafür muss ein setup-Programm geschrieben werden.

vs Dynamisches Nachladen von Code Stationen müssen den Code von Vertreter-Objekten (Remote) oder sogar Implementierungen (Serializable) kennen! Java-Code ist plattformunabhängig, kann über das Netz nachgeladen werden (via HTTP, FTP,...) Für jedes Programm, das Code nachladen muss ( rmiregistry, Client ): ● Security-Manager am Anfang des Programms festlegen: System.setSecurityManager(new RMISecurityManager()); ● Socket-Verwendung in policy -Datei gewähren grant { permission java.net.SocketPermission "*", "accept,connect,listen,resolve"; }; (in ~/.java.policy oder mit -Djava.security.policy=... )

vs Für jedes Programm, das nachladbaren Code anbietet ( Server ): ● Klassen oder JAR auf Web-Server bereitstellen: (enthält RemoteService.class, Server_Stub.class ) ● Codebase des Servers beim Start mit angeben: java -Djava.rmi.server.codebase= " Server & Die Codebase-URL wird bei der rmiregistry hinterlegt. Klienten erhalten bei lookup nicht nur einen Netzverweis, sondern auch die zugehörige Codebase-URL, und laden den Code von dort nach. [Siehe