Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme

Übung 3: Beispielhafter Grobentwurf

Programme

Das Programmsystem ist unter Windows-7 entwickelt worden und besteht aus den folgenden fünf Quelldateien:

Die zugehörigen class-Dateien befinden sich alle in ein und demselben Verzeichnis.

Grobarchitektur

Das Programm wird so gestaltet, dass möglichst viele Programme und Programmteile von den ersten beiden Übungsaufgaben übernommen werden können. Allerdings müssen alle bisherigen Programme überarbeitet werden. Dem Programmsystem liegt folgende Grobarchitektur zu Grunde:


Grobstruktur

Klasse Telefonbuch

Die Klasse Telefonbuch (Telefonbuch.java) aus den ersten beiden Übungsaufgaben wird leicht abgeändert: Sie enthät jetzt zwei Telefonverzeichnisse, eines für die Abteilung Einkauf und eines für die Abteilung Vertrieb. Bei der Instanziierung der Klasse muss jetzt ein Parameter angegeben werden, der die jeweilige Abteilung benennt. Das heißt, dass es die folgenden beiden Instanziierungen des Telefonbuchs gibt:

  1. Telefonbuch tbE = new Telefonbuch("Einkauf");
  2. Telefonbuch tbV = new Telefonbuch("Vertrieb");

Die beiden Methoden tBuchSuche() und tBuchAbfrage() mit der in ihr enthaltenen SuchThread-Klasse bleiben unverändert.

Klasse AbteilungsServer

Neu erstellt wird eine Klasse namens AbteilungsServer (AbteilungsServer.java), die als RMI-Server arbeitet. Sie nimmt über RMI-Aufrufe Query Strings entgegen und startet die zugehörigen Suchvorgänge im jeweiligen Telefonbuch. Gestartet wird der Abteilungsserver jeweils zur entsprechenden Abteilung:

  1. java AbteilungsServer Einkauf
  2. java AbteilungsServer Vertrieb

Der Abteilungsserver startet seinerseits einen RMI-Registry-Prozess an einem Port, dessen Nummer er aus dem Namen der jeweiligen Abteilung ableiten kann. Dazu addiert er den ASCII-Wert des Anfangsbuchstabens des Abteilungsnamens zu 60000. Das ergibt die Werte 60069 für den Registry-Prozess zur Abteilung Einkauf und 60086 für den zum Vertrieb. Danach meldet der Abteilungsserver in der Rechnerkonsole, dass er aktiv ist und benennt die Abteilung, zu der er gehört und den Host, auf dem er gestartet worden ist. Beispielhaft sieht diese Ausgabe folgendermaßen aus:

Abteilungsserver ist aktiv Abteilung: Einkauf Host : sun65 Reg.-Port: 60069 Warte auf RMI-Requests Methoden-Log:

Er wartet jetzt auf RMI-Aufträge und zeigt, falls solche erfolgen, die dabei aufgerufenen Methoden in einer Log-Sequenz an. Für die Durchführung der RMI-Requests benötigt der Abteilungsserver ein Interface mit der Deklaration der fern auszuführenden Methoden (RmiDekl.java) und die Klasse mit den zugehörigen Methodenimplementierungen (RmiImpl.java). Über das RMI-Verfahren werden die beiden Methoden

zur Verfügung gestellt. Erstere führt in jedem der beiden Abteilungsserver zu einer Abfrage des jeweiligen Telefonbuchs, letztere zu einer geordneten Beendung des Abteilungsservers.

Klasse TelefonbuchServer

Die Klasse TelefonbuchServer (TelefonbuchServer.java) aus der zweiten Übungsaufgabe wird um eine Methode namens verteileAbfrage() erweitert. Sie schließt sich unmittelbar an die Analysemethode an, die angepasst werden muss. Bei der zweiten Aufgabe hat analyse() die Telefonbuchklasse instanziiert und Suchaufträge im Telefonbuch ausgelöst. Jetzt übergibt sie den von ihr gestalteten Query String an die verteileAbfrage()-Methode. Diese startet mit einer lokalen Threadklasse namens VerteilerThread nebenläufig RMI-Aufrufe an die beiden Abteilungsserver, die zu diesem Zeitpunkt beide aktiv sein müssen. Handelt es sich bei einem RMI-Aufruf um einen Suchauftrag, dann enthält der Rückgabewert des Aufrufs die Suchergebnisse, die über die analyse()-Methode wie bei der zweiten Aufgabe dem Browser zugeleitet werden. Der Telefonbuchserver benötigt Zugriff auf das Interface mit den Deklarationen der fern aufrufbaren Methoden (RmiDekl.java).

Der (zentrale) Telefonbuchserver arbeitet mit den beiden Abteilungsservern zusammen. Dazu müssen diese zuerst gestartet werden. Beim Aufruf des Telefonbuchservers sind jetzt die Namen der beiden Rechner anzugeben, auf denen die Abteilungsserver laufen. Dazu werden benamte Parameter (e und v) verwendet, deren Reihenfolge keine Rolle spielt. Angenommen, auf dem Rechner namens sun65 des Übungsraums sei der Abteilungsserver der Abteilung Einkauf gestartet worden und auf sun70 der der Abteilung Vertrieb, dann lautet der Aufruf des Telefonbuchservers:

java TelefonbuchServer e=sun65 v=sun70

Wird der Telefonbuchserver auf dem Rechner namens sun60 des Übungsraums gestartet, dann meldet er sich daraufhin auf der Konsole dieses Rechners mit folgendem Dialog:

Zentraler TelefonbuchServer ist aktiv ACHTUNG: Der Server kann nur arbeiten, wenn beide Abteilungsserver laufen! Ist das der Fall? Eingabe: (j/n)->

Wird die Frage mit n beantwortet, erfolgt ein Programmabbruch verbunden mit dem Hinweis, die beiden Abteilungsserver zuerst zu starten. Bei einer j-Antwort meldet sich der Telefonbuchserver mit:

Abteilungen: Einkauf, Vertrieb Host : sun60 Port : 9876 Warte auf Browser-Requests

Bei jedem Browser-Request wird der dabei übermittelte Query String auf der Konsole ausgegeben.

Benutzerschnittstelle

Die Benutzerschnittstelle mit dem Web-Browser ist identisch zu der aus der zweiten Übungsaufgabe.

Programmstart

Das Vorgehen beim Start des Programmsystems soll hier mit konkreten Rechnernamen (aus dem Übungsraum) gezeigt werden. Bei der Abnahme der Übungsaufgabe werden dies in der Regel andere Rechner sein.

Angenommen, auf dem Rechner namens sun75 wird ein lokales Login durchgeführt und dort werden alle benötigten Programme zusammengestellt. Weiter angenommen, der Dozent legt fest, dass der Abteilungsserver Einkauf auf sun65, der Abteilungsserver Vertrieb auf sun70 und der zentrale Telefonbuchserver auf sun60 zu implementieren sind, dann werden zunächst mit sftp die notwendigen Programme zu den Rechnern übertragen. Dann wird zu den drei Rechnern sun60, sun65 und sun70 je eine ssh-Verbindung hergestellt und auf dem lokalen Rechner sun75 ein Web-Browser gestartet. Dann wird folgendermaßen verfahren:

(1) In der ssh-Konsole zum Rechner sun65: javac AbteilungsServer.java java AbteilungsServer Einkauf (2) In der ssh-Konsole zum Rechner sun70: javac AbteilungsServer.java java AbteilungsServer Vertrieb (3) In der ssh-Konsole zum Rechner sun60: javac TelefonbuchServer.java java TelefonbuchServer e=sun65 v=sun70 (4) In der URL-Eingabezeile des Browsers auf sun75: http://sun60:9876


Zurück zum Inhaltsverzeichnis des Manuskripts verteilte Systeme