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.
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:
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:
Die beiden Methoden tBuchSuche() und tBuchAbfrage() mit der in ihr enthaltenen SuchThread-Klasse bleiben unverändert.
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:
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:
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.
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:
Wird der Telefonbuchserver auf dem Rechner namens sun60 des Übungsraums gestartet, dann meldet er sich daraufhin auf der Konsole dieses Rechners mit folgendem Dialog:
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:
Bei jedem Browser-Request wird der dabei übermittelte Query String auf der Konsole ausgegeben.
Die Benutzerschnittstelle mit dem Web-Browser ist identisch zu der aus der zweiten Übungsaufgabe.
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: