Friedrich-Alexander-Universität UnivisSuche FAU-Logo
Techn. Fakultät Willkommen am Department Informatik FAU-Logo
Logo I4
Lehrstuhl für Informatik 4
Middleware
 
  Vorlesung
  Literatur
  Skript
  Übungen
  Scheine, Prüfungen
Aufgaben:
 Aufgabe 1
 Aufgabe 2
 Aufgabe 3
 Aufgabe 4
 Aufgabe 5
 Aufgabe 6
 Aufgabe 7
Department Informatik  >  Informatik 4  >  Lehre  >  WS 2003/04  >  Middleware  >  Übung  >  Aufgabe5

Übungsaufgabe 5: CORBA-Client und Server

In dieser Aufgabe soll das Bibliothekssystem mit Client und Server unter Verwendung von CORBA implementiert werden. Hierzu steht unter /proj/i4mw/pub/aufgabe5 eine IDL bereit, die zu verwenden ist.
Generell gilt im Folgenden: Alle Client-Klassen sollen im Paket library.client abgelegt werden, alle Server-Klassen in library.server.

Teil 1: Client

(a) Als Client soll der aus den ersten Aufgaben bekannte LibraryFrontend dienen; dieser kommuniziert nun mit Hilfe von CORBA mit dem Bibliotheksserver. Es soll wie bisher die Möglichkeit bestehen, ein neues Medium der Datenbank hinzuzufügen, Medien auszuleihen und zurückzugeben und sich alle Medien der Datenbank anzeigen zu lassen. Im Unterschied zu den vorherigen Aufgaben sollen Medien immer durch Angabe des Titels (nicht ID!) angesprochen werden; die Methoden register() und get() erhalten also als Parameter nun den Titel. Zur Vereinfachung sollen außerdem keine unterschiedlichen Medientypen (CD, Book usw.) unterschieden werden; das Bibliothekssystem kennt nur Items.
Ein einfacher Testserver (IOR in /proj/i4mw/pub/aufgabe5/LibraryDB.ior) steht bereit, mit dem der eigene Client getestet werden kann.

(b) Im nächsten Schritt soll der Client so erweitert werden, dass er den CORBA-Namensdienst verwendet, um ein LibraryDB-Objekt zu bekommen. Der Testserver ist dort unter dem Namen mw/LibraryDB registriert. Der eigene Server aus Teil 2 soll unter login/LibraryDB dort registriert werden (wobei login der eigene Login-Name sein soll). Unter /proj/i4mw/pub/aufgabe5/Nameservice.ior wird die Adresse des Root-Namensdiensts bekanntgegeben.

Teil 2: Einfacher Server

(c) Im zweiten Teil soll nun die Serverseite implementiert werden. Als erster Schritt soll ein ganz einfacher LibraryDBServant implementiert werden, der
  • bei register eine AlreadyExistsException erzeugt,
  • bei list eine leere Sequenz von Items zurückliefert und
  • bei get eine NotFoundException erzeugt.
Die Methoden lock() und unlock() sind hier nicht nötig, da die Medien über Remote-Referenzen angesprochen werden und nicht wie bisher zum Client kopiert werden.
Eine Klasse library.server.Main soll einen LibraryDBServant erzeugen, und ihn beim Namensdienst als login/LibraryDB anmelden. Der Servant kann nun mit dem eigenen Client getestet werden.

(d) Im nächsten Schritt soll nun ein Servant für die Medien (ItemServant) implementiert werden. Die ItemServant-Objekte werden in der Methode register() erzeugt. Der LibraryDBServant kann nun entsprechend so erweitert werden, dass er die Medien in einem Vector speichert, und die in (c) beschriebenen Methoden sinnvoll implementiert.

Teil 3: Besserer Server

Da eine Bibliothek gewöhnlich eine große Anzahl an Medien enthält, ist es nicht sinnvoll, für jedes Medium einen aktiven Servant zu erzeugen. Der Server sollte daher nur einen Cache mit den zuletzt verwendeten Medien verwalten, die persistente Speicherung der Daten der Medien wird zweckmässigerweise in einer Datenbank vorgenommen. Hierzu wird eine einfache Pseudo-Datenbank unter library.database.ItemDatabase zur Verfügung gestellt.

(e) Als erstes ist die Main-Methode anzupassen: Für die Implementierung des Caches muss ein eigener POA (ItemPOA) unterhalb des RootPOA erstellt werden (Policies: USER_ID, USE_SERVANT_MANAGER und NON_RETAIN). Für das dynamische Erzeugen von Medien-Servants muss beim ItemPOA ein Servant-Manager (ItemServantLocator) registriert werden.

(f) Nun muss der ItemServantLocator implementiert werden:

  • Als erstes braucht man eine eindeutige ID für Medien. Diese kann direkt aus dem Index in der Datenbank gewonnen werden kann (Konvertierung zwischen int und byte[]!)
  • In der preinvoke-Methode soll der ServantLocator testen, ob es zu der angeforderten ID bereits einen ItemServant im Cache gibt. Wenn vorhanden, wird dieser verwendet, ansonsten wird ein neuer ItemServant mit den Daten aus der Datenbank erzeugt. Der Cache kann sehr einfach verwaltet werden (Hash über ID oder FIFO). Zum Konvertieren von CORBA-Referenzen in Objekt IDs kann die POA-Methode reference_to_id (von dem POA, der die CORBA-Referenz erzeugt hat, siehe (g)) verwendet werden.
  • In der postinvoke-Methode muss, falls das Medium verändert wurde (Ausleihstatus, Ausleihzähler) dieses in die Datenbank zurückgeschrieben werden.

(g) Zuletzt sind die Methoden get und list im LibraryDBServant anzupassen. Diese soll direkt über die Datenbank die IDs der passenden Medien ermitteln. Aus diesen IDs kann über den ItemPOA (mittels create_reference_with_id) eine CORBA-Objektreferenz erzeugt werden, die als Rückgabe der Methoden verwendet werden kann. Hierzu müssen an dieser Stelle keine Daten aus der Datenbank gelesen und auch keine Servants erzeugt werden (das soll später dynamisch durch den ItemServantLocator geschehen)!

Tipps:

Es kann in Teilaufgabe 2 d) bei der Aktiviertung von ItemServants via _this(orb) spaeter bei Methodenaufrufen zu Fehlern kommen, wenn man den ORB von java-1.4 verwendet. Es gibt zwei Alternativen um dies zu vermeiden:
  • Aktivierung via poa.activate_object(..) etc.
  • Man verwendet den JacORB (/local/JacORB). Hierfür müssen folgende Variablen gesetzt werden JRE_HOME (/local/java-1.4), JACORB_HOME (/local/JacORB) und PATH um /local/JacORB/bin erweitern. Start von Client und Server erfolgen dann via jaco library.....

Bearbeitung: bis zum 15.01.2004/18:00 Uhr

Alle Dateien sollen im Verzeichnis /proj/i4mw/loginname/aufgabe5/ abgelegt werden und mit dem abgabe-Programm abgegeben werden.
Die Bearbeitung in 2er Gruppen möglich.

Wir wünschen Ihnen ein schönes Weihnachtsfest und einen guten Rutsch in das Jahr 2004!

  Impressum   Datenschutz Stand: 2004-01-19 11:19   MF, WE