2012W CT05 Intermezzo

Werbung
Komponententechnologien Winter 2012 Intermezzo I Kapitel 5 Komponententechnologien Was ist eine Komponente? (c) Peter Sturm, Universität Trier 1 Komponententechnologien Winter 2012 Größe? Form? (c) Peter Sturm, Universität Trier 2 Komponententechnologien Winter 2012 Jeder versteht Jeden! Klassifizierungskriterien •  Interface-­‐Beschreibung •  Festlegen auf kommunizierbare Datentypen •  Anbinden von Client-­‐ und Komponentencode •  “Sich finden” (Namensproblematik) •  Grad der Unabhängigkeit (c) Peter Sturm, Universität Trier 3 Komponententechnologien Winter 2012 Interface-­‐Beschreibung •  Eigene IDL –  Microsoft IDL (MIDL) im Fall vom COM –  CORBA ebenfalls eigene IDL •  Verbesserungsvorschläge? Kommunizierbare Datentypen •  Spezielle IDL –  Nur recht elementare Typen (MIDL, hohes Alter) –  Komplex und unübersichtlich (CORBA) •  Verbesserungsvorschläge (c) Peter Sturm, Universität Trier 4 Komponententechnologien Winter 2012 Code-­‐Anbindung Interface Description IDL Compiler Server Stub Client Stub .c .c .c .c •  RPC-­‐Erbe sichtbar! –  Spezielle IDL-­‐Compiler generieren Proxies .c Compiler (e.g. C++) •  Vorteil –  Automatismen •  Nachteil –  Mapping auf Zielsprache Server Client •  Verbesserungsvorschläge? „Sich finden“ •  Asymmetrie am Anfang –  „Client“ übernimmt Initiative •  Server / Service / Komponente braucht Namen •  Namensauflösung zu Orts-­‐ und Verbindungsinformation (c) Peter Sturm, Universität Trier 5 Komponententechnologien Winter 2012 Unabhängigkeit •  Heterogene Ansätze –  Hohe Unabhängigkeit –  Kleinster gemeinsamer Nenner •  Homogene Ansätze –  Deutlich flexibler und mächtiger –  Höhere Abstraktionen –  Für Entwickler besser zu verstehen •  Homogener Sprachansatz: Java •  Homogenes Typsystem: .NET OO-­‐RPC (c) Peter Sturm, Universität Trier 6 Komponententechnologien Winter 2012 Aus RPC wird RMI •  Zusätzlicher Objektbezug wird deutlicher •  Siegeszug virtueller Maschinen –  Java-­‐Ökosystem –  .NET Framework JAVA RMI (c) Peter Sturm, Universität Trier 7 Komponententechnologien Winter 2012 Java RMI •  Remote Method Invocation •  Java-­‐basierte OO-­‐Variante eines RPC •  Objekte inkl. Code können ausgetauscht werden –  Vorteil einer homogenen Sprachumgebung –  Sicherheitsproblematik „Function Shipping“ •  Direkte Unterstützung im JDK •  JDK nutzt Reflection für die Generierung der Proxies Architektur RMI RMI Client rmiregistry RMI RMI RMI Server Web Server URL Protocol URL Protocol Web Server http://java.sun.com/docs/books/tutorial/rmi/overview.html (c) Peter Sturm, Universität Trier 8 Komponententechnologien Winter 2012 Am Anfang war ... •  ... ein Interface package syssoft.rmi_example; import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote { int Add ( int x, int y ) throws RemoteException; int Sub ( int x, int y ) throws RemoteException; } •  Ableitung von Marker-­‐Interface Remote (leeres Interface) –  Erkennen RMI-­‐zugänglicher Interfaces über Reflection •  Remote-­‐Methoden „werfen“ RemoteException –  Zugeständnis an mögliche Fehlerfälle in verteilten Systemen package syssoft.rmi_example.server; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import syssoft.rmi_example.*; public class Server implements Compute { public Server() { super(); } public int Add ( int x, int y ) { return x+y; } public static void main(String[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } try { String name = "SyssoftCompute"; Compute engine = new Server(); Compute stub = (Compute) UnicastRemoteObject.exportObject(engine,0); Registry registry = LocateRegistry.getRegistry(); registry.rebind(name, stub); System.out.println("ComputeEngine bound"); } catch (Exception e) { System.err.println("ComputeEngine exception:"); e.printStackTrace(); } } } Server (c) Peter Sturm, Universität Trier 9 Komponententechnologien Winter 2012 Client package syssoft.rmi_example.client; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import syssoft.rmi_example.*; public class Client { public static void main(String[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager(new SecurityManager()); } try { String name = "SyssoftCompute"; Registry registry = LocateRegistry.getRegistry(args[0]); Compute comp = (Compute) registry.lookup(name); int result = comp.Add(21, 21); System.out.println(result); } catch (Exception e) { System.err.println("SyssoftCompute exception:"); e.printStackTrace(); } } } 42 # Compiling, packaging, and distributing the interface javac syssoft/rmi_example/Compute.java jar cvf run/Compute.jar syssoft/rmi_example/Compute.class cp run/Compute.jar ~peter/Sites # Preparing the server javac -­‐cp run/Compute.jar syssoft/rmi_example/server/Server.java # Preparing the client javac -­‐cp run/Compute.jar syssoft/rmi_example/client/Client.java # Starting RMI registry # rmiregistry & # Running server java -­‐cp .:run/Compute.jar -­‐Djava.rmi.server.codebase=http://localhost/~peter/
Compute.jar -­‐Djava.rmi.server.hostname=localhost -­‐Djava.security.policy=run/server.policy syssoft.rmi_example.server.Server & sleep 10 # Running client java -­‐cp .:run/Compute.jar -­‐Djava.rmi.server.codebase=http://localhost/~peter/ -­‐Djava.security.policy=run/client.policy syssoft.rmi_example.client.Client localhost (c) Peter Sturm, Universität Trier 10 Komponententechnologien Winter 2012 .NET Remoting Interface (c) Peter Sturm, Universität Trier 11 Komponententechnologien Winter 2012 Implementierung Server (c) Peter Sturm, Universität Trier 12 Komponententechnologien Winter 2012 Client (c) Peter Sturm, Universität Trier 13 
Herunterladen