Projektstudium SS98 - distributed computing


Namengebung und Binden von Objekten

Dieser Abschnitt beschreibt wie Objekte identifiziert werden, die Optionen, die mit dem Binden von Clients an eine Objekt Implementation existieren und Wege wie Objektreferenzen manipuliert werden können.

 

Interface und Objektnamen

Wenn ein Interface für ein Objekt in einer IDL Spezifikation definiert wird, wird dem Interface ein Name gegeben. Beispielsweise wurde dem Zähler Interface in Eine erste JavaCorba Anwendung der Name Count gegeben:

 

Listing 1: Die Count.IDL


module Counter {

interface Count {

attribute long sum;

long increment();

};

};


 

Wennn ein Objekt erzeugt wird, muß der Server einen Objektnamen spezifizieren, wenn das Objekt dem Client über dem osagent zugänglich gemacht werden soll. Wenn der Server die BOA.obj_is_ready Methode aufruft, wird der Name des Objektinterfaces beim VisiBroker osagent nur registriert, wenn das Objekt bei der Erzeugung einen Namen erhalten hatte.

Die Verwendung von Objektnamen durch eine Client Anwendung wird benötigt, wenn sie mehr als ein Objekt einer Objektinstanz zur Zeit bindet. Der Objektname dient zur Unterscheidung zwischen den verschiedenen Instanzen eines Interfaces. Wenn ein Objekt Name nicht spezifiziert wird, wenn die bind Methode aufgerufen wird, wird der osagent ein zum spezifiziertem Interface passendes Objekt zurückgeben.

 

Verwendung aussagekräftiger Namen mit Servern

Wenn man das Count Beispiel aus Eine erste Java/CORBA Anwendung betrachtet, kann man sich vorstellen, daß die Anwendung für das Messen der Geschwindigkeit zweier Hosts verwendet werden kann. Dazu werden zwei Count Objekte benötigt, die jeweils auf einen der beiden Hosts liegen. Zur Unterscheidung zwischen diesen beiden Count Objekten, würden Namen verwendet werden.

Jeder Server könnte seine eigene Instanz von CountImpl Objekt besitzen. Beide Server würden den Konstruktor bei der Erzeugung verwenden, der einen Objekt Namen akzeptiert. Listing 2 zeigt den Server Code für die Erzeugung eines CountImpl mit dem Namen "My Count". Listing 3 zeigt wie ein Client eine Verbindung zum CountImpl "My Count" aufbauen würde.

 

Listing 2: CountServer: Das Main Server Programm:


class CountServer {

static public void main(String[] args) {

try {

//Initialisierung des ORB

org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

 

//Initialisierung des BOA

org.omg.CORBA.BOA boa = orb.BOA_init();

 

//Erzeugen eines Count Objektes mi dem Namen "My Count"

CountImpl count = new CountImpl("My Count");

 

//Exportieren des neu erzeugten Objektes an den ORB

boa.obj_is_ready(count);

 

//Ready to service requests

boa.impl_is_ready();

}

catch(org.omg.CORBA.SystemException e) {

System.err.println(e);

}

}

}


 

Listing 3: CountClient: Das Client Programm


class CountClient {

public static void main(String args[]) {

try {

//Initialisierung des ORB

System.out.println("Initializing the ORB");

org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);

 

//Binden an das Count Objekt

System.out.println("Binding to Count Object");

Counter.Count counter = Counter.CountHelper.bind(orb, "My Count");

 

//Initialisieren des sum-Attributes

System.out.println("Setting sum to 0");

counter.sum((int)0);

 

//Startzeit ermitteln

long startTime = System.currentTimeMillis();

 

//100 mal sum inkrementieren

System.out.println("Incrementing");

for (int i = 0; i < 1000; i++)

counter.increment();

 

//Kalkulation der vergangenen Zeit und Ausgabe der Ergebnisse

long stopTime = System.currentTimeMillis();

System.out.println("Avg Ping = "

+ ((stopTime - startTime)/1000f) + "msecs");

System.out.println("Sum = " + counter.sum());

}

catch(org.omg.CORBA.SystemException e) {

System.err.println("System Exception");

System.err.println(e);

}

}

}


 

Binden an Objekte

Bevor eine Client Anwendung Methoden eines Interfaces aufrufen kann, muß sie zunächst in den Besitz einer Objektreferenz gelangen. Dies geschieht unter Verwendung der bind Methode. Listing 4 zeigt die für die CountHelper Klasse automatisch generierten bind Methoden.

Sämtliche Formen des Bindens benötigen als ersten Parameter ein org.omg.CORBA.ORB Objekt. Die erste Form der bind Methode besitzt nur diesen ersten Parameter und verbindet den Client mit irgendeiner Implementation von Count. Die zweite Form erlaubt den Clients einen Objektnamen zu spezifizieren. Dies geschieht in Form eines Strings, der für eine URL steht. Die dritte Form erlaubt einen Namen für das Objekt, einen Namen für den Host, und zusätzlichen Optionen für das Binden anzugeben.

 

Listing 4: Formen der bind Methoden


package Counter;

abstract public class CountHelper {

...

public static Counter.Count bind(org.omg.CORBA.ORB orb) {

...

}

public static Counter.Count bind(org.omg.CORBA.ORB orb, java.lang.String name) {

...

}

public static Counter.Count bind(org.omg.CORBA.ORB orb, java.lang.String name,

java.lang.String host, org.omg.CORBA.BindOptions options) {

...

}

...

}

}


 

Der Binde Prozeß

Wenn der CountClient die bind Methode aufruft, führt der ORB mehrere Funktionen im Namen des Clients durch:

 

Client und Server auf verschiedenen Hosts

Wenn ein Client einen Objektserver, der auf einen entfernten Host residiert, anfragt, wird eine TCP/IP Verbindung zwischen dem Client und dem Objekt Server etabliert. Der ORB wird eine Instanz des Stubs (Stubs werden auch als Proxy Objekte bezeichnet) für die Verwendung mit dem Client erzeugen. Wenn eine Methode des Proxy Objekts aufgerufen wird, wird sie in einen Buffer geschrieben, wenn sie zu einem entfernten Host geschickt wird, weil der Server dort residiert. Der Server auf dem entfernten Host wird die gewünschte Methode aufrufen und das Resultat an den Client zurücksenden.

Client und Server in einem einzigen Prozeß

Die vorherige Erläuterung unterstellt, daß Objektimplementationen die Form eines Server Prozesses annehmen. Obwohl dies meistens der Fall ist, kann es vorkommen, daß sich ein Client und die entsprechende Objektimplementation im gleichen Prozeß befinden. Wenn die Client Anwendung ein bind in diesem Szenario aufruft, wird der ORB einen Pointer zu der Objekt Implementation selbst zurückgeben. Dieser Pointer wird zum Objekt Typ, der in der Client Anwendung verwendet wird, erweitert. Sämtliche Methodenaufrufe bezüglich des Client Objektes werden dann direkt als Java Methoden der Objektimplementation aufgerufen. Der ORB wird nur innerhalb des Binde Prozesses einbezogen.

 

Spezifizieren von Binden Optionen

Diese Sektion beschreibt die wichtigsten Optionen, die zum Kontrollieren des Verhaltens des bind Prozesses verwendet werden. Listing 5 zeigt die vom idl2java Compiler für die CountHelper Klasse generierte bind Methode, die das Spezifizieren von Binde Optionen erlaubt.

 

Listing 5:


package Counter;

abstract public class CountHelper {

...

public static Counter.Count bind(org.omg.CORBA.ORB orb, java.lang.String name,

java.lang.String host, org.omg.CORBA.BindOptions options) {

...

}

...

}

}


 

BindOptions

Die BindOptions Klasse wird als vierter Parameter für die bind Methode, die in Listing 5 gezeigt wird, verwendet. Sie erlaubt dem Entwickler verschiedene Aspekte der Verbindung zwischen der Client Anwendung und der Objektimplementation zu kontrollieren. Die Klasse BindOptions besitzt die Boolean Werte-defer_bind und enable_rebind. Dafür folgendes Beispiel:

 

Listing 6:


...

//Initilisierung der Binde Optionen

org.omg.CORBA.BindOptions bindOptions = new org.omg.CORBA.BindOptions();

bindOptions.defer_bind = false;

bindOptions.enable_rebind = false;

//Lokalisierung eines CountImpl

Counter.Count counter = Counter.CountHelper.bind(orb, "My Count", null, bindOptions);


 

Aufschieben des Bindens

Wenn defer_bind auf true gesetzt wird, erzeugt die bind Methode ein Proxy Objekt und gibt wenn nötig eine Objektreferenz an das Client Programm zurück. Eine Verbindung mit der Objektimplementation wird nicht bevor die Anwendung eine Methode des Objektes aufruft aufgebaut. Wenn defer_bind auf false gesetzt wird, wird die Verbindung errichtet, wenn bind aufgerufen wird. Der default ist, daß eine Verbindung aufgebaut wird, wenn bind aufgerufen wird.

 

Erlauben von Re-Binds

Wenn die TCP Verbindung zwischen Client und der Objekt Implementation wegen eines Netzwerkfehlers fehlschlägt, versucht VisiBroker automatisch ein re-bind zum Server Prozeß Selbst oder einem Replik des Servers Prozesses.

Wenn der Prozeß des re-bind erlaubt sein soll, muß enable_rebind auf true gesetzt werden. Wenn diese Verhalten unerwünscht ist, muß enable_rebind auf false gesetzt werden. Das default Verhalten ist, ein re-bind zum Server im Falle eines Netzwerkfehlers zu versuchen.

 

Operationen auf Objektreferenzen

Die Objektreferenz, die von der Client Anwendung durch bind Methode zurückgegeben wird, repräsentiert ein ORB Objekt. Die Client Anwendung kann die Objektreferenz zum Aufrufen von Methoden, die in der IDL Interface Spezifikation des entsprechenden Objektes definiert wurden sind, verwenden. Zusätzlich existieren Methoden, die sämtliche ORB Objekte von der Klasse org.omg.CORBA.Object erben. Diese Methoden können zur Manipulation von Objekten verwendet werden. Die wichtigsten sind unten aufgelistet:

 


Methode

Erläuterung

_clone

Erzeugt eine Kopie des Objektes. Zusätzlich wird eine weitere TCP/IP Verbindung erzeugt.

_is_a

Bestimmt, ob ein Objekt ein bestimmtes Interface implementiert.

_is_bound

Gibt true zurück, wenn eine Verbindung für dieses Objekt aktiv ist.

_is_equivalent

Gibt true zurück, wenn zwei Objekte auf die gleiche Objekt Implementation verweisen.

_is_local

Gibt true zurück, wenn das Objekt im lokalen Adressraum residiert.

_is_remote

Gibt true zurück, wenn die Objekt Implementation nicht im lokalen Adressraum residiert.

_object_name

Gibt den Namen des Objektes zurück.


 

Konvertieren einer Objektreferenz zu einem String

Objektreferenzen sind undurchsichtig und können sich von ORB zu ORB unterscheiden. Aus diesem Grund bietet VisiBroker Methoden, die das Konvertieren eines Objektes in einen String und umgekehrt erlauben. Dieser Vorgang wird "stringfication" bezeichnet.


Object_to_string

Konvertiert eine Objektreferenz in einen String.

String_to_object

Konvertiert einen String zurück in eine Objektreferenz


 

nächste Seite 


© Copyright 1998 André Möller, Oliver Mentz & Magnus Wiencke