Realisierung verteilter Anwendungen: Teil 3 Ralf Möller, FH Wedel Beim vorigen Mal: Sockets, RMI Inhalt heute Common Object Request Broker Architecture (CORBA) Lernziele: Verständnis von bestehenden Architekturen: CORBA Ein BeiSpiel: Simple Baseball public class Bat { public void play (Ball ball) { ball.hit(); } public static void main (String args[]) { Ball ball = new Ball(); Bat bat = new Bat(); bat.play(ball) } } public class Ball { public void hit() { System.out.println("Ball has been hit.") } } $ java Bat Ball has been hit. Common Object Request Broker Architecture Vergleich RPC Verteilung bedeutet mehr als Transparenz des entfernten Aufrufs Dienste statt Prozeduren ! Aspekte der Heterogenität Verschiedene Verschiedene Verschiedene Verschiedene Rechnerarchitekturen Betriebssysteme Programmiersprachen Compiler-Versionen In CORBA: Plattform-unabhängige Interface Definition Language (IDL) "Kleinster gemeinsamer Nenner" CORBA-RMI Sprachunabhängigkeit Zusätzlich zu Java-RMI: Object adaptor Implementation repository Interface repository Standard für die Referenzierung entfernter Objekte Namensraumverwaltung CORBAservices Fundamentale Dienste, die von fast jeder Applikation oder fast jedem Objekt benötigt werden Definiert über IDL, Ansprechen als "normale" Objekte: Lifecycle Service Relationship Service Naming Service Trader Service Security Service Persistence Service Concurrency Control Service ... CORBAfacilities Horizontale Schicht Branchenunabhängige Dienste z.B. bzgl. Dokumenten bestehend aus Texten, Bildern, Tabellen Vertikale Schicht Dienste für spezifische Branchen (Gesundheitswesen, Bankwesen, Petrochemie, Telekommunikation) z.B. zur Bearbeitung von Dokumenten User Interface, Information Management, Task Management, System Management Koordination durch ORB CORBA-RMI: Die Client-Seite Client spricht ORB nicht direkt an Für Serverobjekt gibt es Repräsentanten (stub) Stub übernimmt Aufgabe, mit dem ORB zu kommunizieren Statischer vs. dynamischer Mechanismus Schnittstelle zur Übersetzungszeit bekannt? Interface Repository: Beschreibung aller registrierten Objekte, ihrer Methoden und Attribute CORBA-RMI: Die Server-Seite Objektadapter übernimmt ORB-Kommunikation ... registriert Klassen in ImplementierungsRepository, ... und vergibt eindeutige Objektreferenzen CORBA schreibt Basis-Objektadapter vor (BOA) Ebenfalls standardisiert: POA (portable Objektadapter) ORB: Der Broker Definiert durch Interface Um ein Objekt ansprechen zu können, ist eindeutige Referenz notwendig Referenz wird bei Objekterzeugung durch ORB zugeteilt Gültigkeit, solange Objekt existiert ... ... selbst, wenn Objekt seinen Standort wechselt Hier verwendet: VisiBroker Bekanntmachen einer Referenz Objektreferenz kann anderen Objekten bekanntgemacht werden Ablegen in File oder Datenbank Herauslesen aus Client (Ergebnis voriger Aufrufe) Client kann sich an Dienst wenden, der Objektreferenzen zur Verfügung stellt Naming Service (Abbildung Name -> Referenz) Trader Service (Anbieten von Objekten mit dem gleichen Service, aber unterschiedlichen Konditionen oder mit unterschiedlichen Qualitätsmerkmalen) Client kann eines der Objekte wählen (lassen) Aufrufe über CORBA: Statische Aufrufe Verwendung eines Stellvertreters (Stub) Transparenz: Aufruf wie lokaler Aufruf Stub verpackt Parameter (Marshalling) ... ... und wendet sich an ORB, der den Aufruf ... ... an den Objektadapter auf Serverseite schickt Objektadapter aktiviert oder erzeugt Objekt ... ... und reicht Aufruf an Skeleton. Skeleton entpackt Parameter (Demarshalling) ... ... und ruft Objektimplementierung auf. Die CORBA-Architektur Aufrufe über CORBA: Dynamische Aufrufe Notwendig z.B. wenn Typ des aufgerufenen Objekts nicht zur Übersetzungszeit bekannt war Interface wird dynamisch beim ORB erfragt Weniger effizient CORBA Interface Definition Language: IDL CORBA IDL (im Ggs. etwa zu Java) definiert keine Klassen Entfernte Objekte können als Argumente angegeben werden Instanzen können nicht als Argumente angegeben werden Client C++ Java Smalltalk Interface IDL C++ Java Smalltalk Implementierung CORBA-IDL Syntax (1) Namensräume <Namensraum>::<Identifikator> module <identifier> { interface <identifier> [: <inheritance> ] { attribute <type> <identifier>; exception <exception_name>; [<op_type>] <identifier>([in|inout|out] parameter) raises <exception_name> [ { <ctype> <context> } ]; }} CORBA-IDL Syntax (2) Basistypen: boolean, char, int, float struct <struct_name> { <type> <identifier> ... }; union <union_name> { <type> <identifier> ... }; typedef <type> <identifier>; enum <type> { <identifier>, ... }; const <const_declaration>; Der IDL-Compiler (1) In Java: idl2java file.idl Generierung von Client-Stub-Deklartionen _st_<class>.java public class _st_<class> extends org.oma.CORBA.portable.ObjectImpl implements <interface> Fähigkeiten zur Berechnung der externen Datenrepräsentation Der IDL-Compiler (2) Generierung von Skeleton-Deklarationen _<class>ImplBase.java abstract public class _<class>ImplBase extends org.omg.CORBA.portable.Skeleton implements <interface> { ... } Fähigkeiten zur Rückrechnung der externen Datenrepräsentation Generierung von Holder- und Helper-Klassen, verantwortlich für Abbildung von IDL nach Java Methoden zum Serialisieren und Deserialisieren Rückkopieren von Out. und Inout-Parameter Eintragung in Interface und Implementation Repositories Das IDL-Java-Mapping Typedef in Java ignoriert (direkt eingesetzt) Enum in Java durch Konstanten simuliert Union und struct in Java durch Klassen dargestellt Ein einfaches Beispiel: IDL für Baseball-Spiel module BatBall { interface Ball { void hit(in string by); }; }; siehe: Java in verteilten Systemen Marko Boger Ein einfaches Beispiel: Java (1) package BatBall; import org.omg.CORBA.*; public class BallServer extends BatBall._BallImplBase { public BallServer(String bind_name) { super(bind_name); } public void hit(String by) { System.out.println("Ball has been hit by " + by); } Ein einfaches Beispiel: Java (2) public static void main(String args[]) { try { ORB orb = ORB.init(); BOA boa = orb.BOA_init(); BallServer ball = new BallServer("Ball"); orb.connect(ball); boa.obj_is_ready(ball); boa.impl_is_ready(ball); } catch (Exception e) { e.printStackTrace(); }}} Ein einfaches Beispiel: Java (3) einfacher package BatBall; Namensdienst import org.omg.CORBA.*; durch automatisch public class Bat { erzeugte public static void main(String args[]) { Hilfsklasse ORB.orb = ORB.init(); Ball ball = BallHelper.bind(orb,"Ball"); ball.hit("Ralf"); System.out.println("I hit the ball"); }} server$ vbjc -d BallServer.java ; vbj BatBall.BallServer client$ vbjc -d Bat.java ; vbj BatBall.Bat client| I hit the ball server| Ball has been hit by Ralf Ereignisorientierte Kommunikation in CORBA event channel supplier consumer notification notification proxy consumer notification proxy supplier Benachrichtigung statt Methodenaufruf Asynchrone Kommunikation Weitere Dienste (CORBAservices) evtl. später... Resümee Und wir haben noch längst nicht alles gesehen ... Bevor alle davoneilen Fortsetzung der Diskussion über Middleware ... Migration von Objekten (Voyager) Spontane Vernetzung (Jini) ... beim nächsten Mal.