Menu Content/Inhalt
Startseite arrow Java arrow ORBs - Object Request Broker
ORBs - Object Request Broker Drucken E-Mail
Geschrieben von Michael Peuß   

Was ist ein ORB?

In einer verteilten Anwendung, in der die entfernten Programmteile über Sockets kommunizieren, würde man normalerweise sehr oft daran erinnert werden, dass es sich um eine verteilte Anwendung handelt, weil bei jedem Aufruf einer entfernten Methode immer wieder eine neue Socket-Verbindung aufgebaut werden muss und diese anschliessend auch wieder abgebaut werden muss.

Eine bequemere Möglichkeit ist, wenn man die ganze Socket-Programmierung in eine lokale und eine entfernte jeweils seperate Klasse kapselt, die die enfernten Dienste so aussehen lässt, als ob sie lokal zur Verfügung stehen würden. Weil solche Klassen Anfragen zwischen lokalen und entfernten Objekten vermittelt, nennt man sie Object Request Broker (Objekt-Anfrage-Vermittler), kurz ORB.

Aufgaben eines ORBs

Die Aufgabe eines ORBs ist es, lokal eine Schnittstelle von jedem entfernten Dienst anzubieten. Der ORB muss dazu für jeden entfernten Dienst eine lokale Methode implementieren, die die Daten (Parameter) eines lokalen Aufrufers entgegen nimmt, über das Netz verschickt, das Resultat vom Netz entgegen nimmt und anschliessend wieder an den lokalen Aufrufer zurück gibt.

Um die Sache am Anfang einfach zu halten, gehen wir vorerst davon aus, dass das lokale System keine Dienste anbietet, sondern nur Dienste vom entfernten System in anspruch nimmt. Deshalb wird im folgenden der lokale ORB als ClientORB und der entfernte als ServerORB bezeichnet. Später kann natürlich ein ORB sowohl ClientORB als auch ServerORB sein. Am Prinzip ändert sich dadurch ja nicht viel.

 

Kommunikation zwischen den ORBs

Weil auch die ORBs nicht direkt die Methoden der entfernten ORBs aufrufen können, bekommen alle entfernten Methoden eine eindeutige Zahl (ID) zugeordnet. Diese Zahl muss natürlich beiden ORBs bekannt sein. Wenn ein ClientORB eine solche Zahl übermittelt, weiss der ServerORB sofort, welchen Dienst er aufrufen soll. Falls der Dienst Parameter benötigt, wartet er jetzt darauf die Parameter übermittelt zu bekommen. Wenn er diese bekommen hat oder wenn der Dienst keine Parameter braucht, ruft der ServerORB den Dienst auf, erhält einen Rückgabewert als Antwort (wenn die Methode nicht vom Typ void ist) und verschickt diese Antwort wieder über das Netz zum ClientORB.

Folgendes Diagramm veranschaulicht das Muster (Design-Pattern) eines ORBs.

 

Java-Code eines ClientORBs

Der folgende Java-Code implementiert einen ClientORB, der die entfernte Methode "summe()" anbietet. Diese Methode berechnet die Summe von zwei Zahlen.

Die Main-Methode startet den Client, übergibt als Beispiel zwei Zahlen und schreibt das Ergebnis (hier die Zahl 7) auf die Konsole.

Beschreibung des Codes:

  • Verbindung zum Server herstellen (8)
  • Streams herstellen (9 -12)
  • Methoden-Kennung übermitteln (14)
  • Parameter der Methode übermitteln (15, 16)
  • Ausgabepuffer leeren, alles abschicken (17)
  • Resultat lesen und zwischenspeichern (18)
  • Verbindung trennen (19)
  • Ergebnis an die aufrufende lokale Instanz zurückgeben (20)

Java-Code eines ServerORBs

Der ServerORB hat die Aufgabe auf einem Port auf Anfragen von Clients zu warten. Wenn ein Client eine Methoden-Kennung schickt überprüft der Server ob noch weitere Parameter erforderlich sind. Er liest diese ggf. ein und ruft damit den für ihn lokalen Dienst auf. Dabei agiert er selbst dem Dienstleister gegenüber als Client. Wenn die Methode nicht vom Typ void ist, leitet der ServerORB das Ergebnis auf den Ausgabe-Stream. Damit hat er die Anfrage abgearbeitet und wartet weiter in der Endlosschleife auf Anfragen von Clients.

In einer Main-Methode, die hier nicht angezeigt wird, wird lediglich der Server gestartet.

Beschreibung des Codes:

  • es werden von allen lokalen Klassen, die Dienste für entfernte Objekte anbieten Instanzen angelegt (8, 9)
  • Ein neuer Socket wird angelegt (10)
  • es wird solange gewartet, bis jemand auf Port 1234 eine Methoden-Kennung sendet (13)
  • Streams werden aufgebaut (14 - 17)
  • es wird untersucht, welche Methode aufgerufen werden soll (19)
  • die Parameter werden ggf. eingelesen und gespeichert (21, 22)
  • die Parameter werden der Methode übergeben und das Ergebnis dem Aufrufer übermittelt (23)
  • alles wird abgeschickt (31)
  • es wird wieder auf neue Anfragen gewartet (13)