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  >  Aufgabe6

Übungsaufgabe 6: Library - JINI

In dieser Aufgabe soll die Client/Server-Anwendung aus Aufgabe 4 mit Hilfe von JINI verbessert werden. Als Ausgangspunkt kann die Bibliotheksverwaltung aus Aufgabe 1 oder Aufgabe 4 dienen.

Teilaufgabe a)

Wir beginnen mit der LibraryDB. Diese soll wie in Aufgabe 4 die Datenbank darstellen und von Clients über Veränderungen informiert werden. Die Clients sollten demzufolge auf ein Objekt dieses Types zugreifen können, d.h. es soll ein Remote-Objekt sein und, wie bisher auch, das Interface LibraryDB implementieren. Um Bibliotheksdienste anderer Gruppen nutzen zu können müssen die Schnittstellen exakt gleich sein. Im Verzeichnis /proj/i4mw/pub/aufgabe6 ist daher das Interface LibraryDB nochmals vorgegeben. Schreiben Sie nun eine Klasse library.server.Server, welche ein Objekt vom Typ LibraryDBImpl erzeugt und es bei allen Lookupdiensten registriert. Die Lookupdienste sollen zuvor mittels Multicastdiscovery gesucht werden; als Proxy kann ein RMI-Stub dienen.
Ändern Sie anschließend die Klasse library.client.LibraryFrontend, so dass diese eine Referenz auf die Datenbank im Konstruktor übergeben bekommt. Anschließend erstellen sie die Klasse library.client.Client, welche einen Lookupdienst per Multicast sucht und dort anschließend einen Proxy für eine LibraryDB herunterlädt.
Zum Testen können Sie den Lookupdienst reggie auf einem Rechner im CIP-Pool starten.

Teilaufgabe b)

Um den eigenen LibraryDB Service zu identifizieren soll nun ein IDEntry erstellt werden, welcher mindestens einen Namensstring enthält. Sowohl dem Server als auch dem Client soll ein Name auf Kommandozeile übergeben werden. Beim Registrieren soll der Dienst mit Hilfe eines IDEntry Objekts markiert werden. Der Client soll nun den eigenen Service suchen. Außerdem soll die Methode getName in der Klasse LibraryDBImpl diesen Namen zurückgeben.

Teilaufgabe c)

In diesem Schritt soll der Client um den Befehl "list" (wie in Aufgabe 2) erweitert werden. Dieser soll bei jedem gefundenen LookupService nach allen LibraryDB Diensten suchen und die dort vorhandenen Bücher ausgeben. Die Methode getName der LibraryDB Objekte kann dazu genutzt werden die Ausgabe zu strukturieren.

Teilaufgabe d)

Nun sollen Clients nach Bibliotheken suchen können, welche ein bestimmtes Buch anbieten. Erstellen Sie dazu das Objekt ItemEntry, welches mindestens den Titel eines Items enthalten soll. Der Server muss nun dafür sorgen, dass die Entry Objekte, welche bei den Lookupservicen hinterlegt sind, im Falle eines "register"-Aufrufes aktualisiert werden.
Ein Client soll nun bei einem "borrow" Befehl eine Bibliothek suchen, die das gewünschte Item enthält. Der Befehle "register" soll weiterhin auf den beim Starten spezifizierten Bibliotheksdienst angewendet werden. Bei "return" soll ebenfalls eine Bibliothek gesucht werden, bei der das Item zurückgegeben werden kann.

Teilaufgabe e)

Nun sollen die Clients wie in Aufgabe 4 eine kurze Meldung ausgeben, wenn ein neues Item in einer Datenbank eingetragen wird. Ein Client soll sich dazu bei jedem gefundenen Bibliotheksdienst registrieren. Ein Dienst soll alle registrierten Clients über Zustandsänderungen (bei einem register-Aufruf) informieren. Verwenden sie bei der Implementierung die RemoteEvent Schnittstellen von JINI.


allgemeine Hinweise:

  • Bei der Angabe einer Codequelle (java.rmi.server.codebase) ist zu beachten, dass die Angabe für den Client (Codenutzer) gedacht ist. Eine Angabe wie z.B. http://localhost:8080 funktioniert somit nur solange sich der Client auf dem gleichen Rechner befindet wie der Server. Es ist daher immer besser den vollständigen Namen des Rechners (z.B. faui00a.informatik.uni-erlangen.de) anzugeben!
  • Beim Registrieren eines Dienstes muss im ServiceItem der Proxy des Dienstes angegeben werden. Ist die Klasse, welche den Dienst darstellt, von UnicastRemoteObject abgeleitet, so reicht es nicht einfach das Objekt zu übergeben. Es muss der Stub (Rückgabe von UnicastRemoteObject.exportObject(...)) übergeben werden. Ansonsten wird das gesamte Service-Objekt zum Lookup Dienst übertragen.

Bearbeitung: bis zum 29.01.2004/18:00 Uhr

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