Realisierung verteilter Anwendungen: Teil 3 zBeim vorigen Mal: Sockets, RMI zInhalt heute yCommon...

Post on 06-Apr-2016

215 views 0 download

Transcript of Realisierung verteilter Anwendungen: Teil 3 zBeim vorigen Mal: Sockets, RMI zInhalt heute yCommon...

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.