Post on 06-Apr-2016
Realisierung verteilter Anwendungen: Teil 3
Beim vorigen Mal: Sockets, RMIInhalt heute
Common Object Request Broker Architecture (CORBA)Lernziele:
Verständnis von bestehenden Architekturen: CORBA
Ralf Möller, FH Wedel
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 BatBall has been hit.
Common Object Request Broker Architecture
Vergleich RPC
Verteilung bedeutet mehr alsTransparenz des entfernten Aufrufs
Dienste stattProzeduren !
Aspekte der Heterogenität
Verschiedene RechnerarchitekturenVerschiedene BetriebssystemeVerschiedene ProgrammiersprachenVerschiedene Compiler-Versionen
In CORBA: Plattform-unabhängigeInterface Definition Language (IDL)
"Kleinster gemeinsamer Nenner"
CORBA-RMI
SprachunabhängigkeitZusä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, TabellenVertikale 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 anFür Serverobjekt gibt es Repräsentanten
(stub)Stub übernimmt Aufgabe, mit dem ORB zu
kommunizierenStatischer 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 Implementierungs-Repository, ...
und vergibt eindeutige ObjektreferenzenCORBA schreibt Basis-Objektadapter vor
(BOA)Ebenfalls standardisiert: POA (portable
Objektadapter)
ORB: Der Broker
Definiert durch InterfaceUm ein Objekt ansprechen zu können, ist
eindeutige Referenz notwendigReferenz wird bei Objekterzeugung durch ORB
zugeteiltGültigkeit, solange Objekt existiert ...... selbst, wenn Objekt seinen Standort
wechseltHier 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 AufrufeVerwendung eines Stellvertreters (Stub)Transparenz: Aufruf wie lokaler AufrufStub verpackt Parameter (Marshalling) ...... und wendet sich an ORB, der den Aufruf ...... an den Objektadapter auf Serverseite schicktObjektadapter 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 erfragtWeniger 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
C++ Java Smalltalk
C++ Java Smalltalk
IDL
Client
Implementierung
Interface
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, floatstruct <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.idlGenerierung 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 simuliertUnion 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 SystemenMarko 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)
package BatBall; import org.omg.CORBA.*; public class Bat {
public static void main(String args[]) { 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.BallServerclient$ vbjc -d Bat.java ; vbj BatBall.Batclient| I hit the ballserver| Ball has been hit by Ralf
einfacher Namensdienst
durch automatischerzeugte
Hilfsklasse
Ereignisorientierte Kommunikation in CORBA
Benachrichtigung statt MethodenaufrufAsynchrone KommunikationWeitere Dienste (CORBAservices) evtl.
später...
consumersupplier
proxy consumernotification
proxy supplier
event channel
notificationnotification
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.