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.