Common Object Request Broker Architecture (CORBA)

Werbung
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.
Herunterladen