Netzprogrammierung (WS 2007/2008)  19538
Übungsblatt  6
Ausgabe 08.01.08
Abgabe 22.01.08 - 14°°

Aufgaben
 
  1. Aufgabe:
    In dieser Aufgabe sollen Klienten zur Abfrage von Angeboten und Preissuchmaschinen auf RMI-Basis implementiert werden. In der ZIP-Datei http://www.ag-nbi.de/lehre/0708/V_NP/aufgaben/blatt6_schnittstellen.zip finden Sie zum einen die Schnittstelle für ein Angebot (Offer) für einen Artikel und zum anderen die Schnittstelle für eine Preissuchmaschine (PriceEngine), die Sie für diese Aufgabe verwenden sollen.
    Hinweis: Der Standardport der rmiregistry ist 1099. Sie kann aber auch auf jedem anderen Port gestartet werden.

    1. Implementieren Sie in Java ein Kommandozeilenprogramm, mit dem Sie das Angebot zu einer gegebenen RMI-URL ausgeben können.

      Aufrufsyntax:

      java -jar offer-client.jar <offer-url>

      Beispiel:

      > java -jar offer-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/offer01
      Article: FooBar
      Vendor: ACME
      Price: 123.45

      Testen Sie Ihr Programm an folgenden URLs:

      //vader.inf.fu-berlin.de:1099/3000/offer01 bis //vader.inf.fu-berlin.de:1099/3000/offer32

    2. Implementieren Sie in Java ein Kommandozeilenprogramm, mit dem Sie eine Preissuchmaschine zu einer gegebenen RMI-URL bedienen können.

      Aufrufsyntax:

      java -jar price-engine-client.jar <price-engine-url> articles
      java -jar price-engine-client.jar <price-engine-url> bestOffer <article>
      java -jar price-engine-client.jar <price-engine-url> enter <offer-url>
      java -jar price-engine-client.jar <price-engine-url> clear

      Beispiele:

      > java -jar price-engine-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngine enter \
      //RECHNER.inf.fu-berlin.de:1099/30XX/offer01

      > java -jar price-engine-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngine articles
      Available articles:
      FooBar

      > java -jar price-engine-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngine bestOffer FooBar
      Best offer for FooBar
      Vendor: ACME
      Price: 123.45

      > java -jar price-engine-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngine clear
      [alle registrierten Artikel werden aus der Liste entfernt]

      Testen Sie Ihr Programm an folgenden URLs:

      //vader.inf.fu-berlin.de:1099/3000/priceEngine

      //vader.inf.fu-berlin.de:1099/3000/offer01 bis //vader.inf.fu-berlin.de:1099/3000/offer32



  2. Aufgabe:
    In dieser Aufgabe sollen Server zur Bereitstellung von Angeboten und Preissuchmaschinen auf RMI-Basis implementiert werden. Die Adressen der Server geben Sie bitte über die Mailingliste bekannt. Das kann auch für Aufgabe 3 nützlich sein.

    1. Implementieren Sie die Schnittstelle für ein Angbot (Offer) und schreiben Sie eine main-Methode, die ein Angebot mit einem angegebenen Artikelnamen, Verkäufer und Preis in einer lokalen RMI-Registry (also unter localhost) anmeldet. Falls Sie einen anderen Port als den Standartport verwenden, erwähnen Sie das bitte in Ihrer Dokumentation!

      Aufrufsyntax:

      java -jar offer-server.jar <offer-url> <article> <vendor> <price>

      Beispiel (sofern Ihre Gruppenr. 23 ist):

      > java -jar offer-server.jar //localhost/3023/foobar FooBar ACME 123.45

      Erstellen Sie mehrere solcher Angebote und testen Sie Ihre Implementierung mit dem Klienten aus Aufgabe 1a).
      Lassen Sie mehrere solcher Angebote auf einem Linux- oder Solaris-Poolrechner laufen oder kontrollieren Sie regelmäßig, ob Ihre Objekte noch ansprechbar sind. Das Kommandozeilenprogramm screen wird dafür nützlich sein. Eine gute Idee ist es auch, die gesamte Abfolge der Kommandos in einem Bashscript (o.ä) festzuhalten..

    2. Implementieren Sie die Schnittstelle für eine Preissuchmaschine (PriceEngine) und schreiben Sie eine main-Methode, die eine Preissuchmaschine in einer lokalen RMI-Registry anmeldet.

      Aufrufsyntax:

      java -jar price-engine-server.jar <price-engine-url>

      Beispiel (sofern Ihre Gruppenr. 23 ist):

      > java -jar price-engine-server.jar //localhost/3023/priceEngine

      Testen Sie Ihrere Implementierung mit dem Klienten aus Aufgabe 1b).
      Lassen Sie mindestens ein Exemplar Ihrer Preissuchmaschine laufen und tragen Sie mehrere der Angebote aus 2a) ein und kontrollieren Sie auch hier regelmäßig, ob die Suchmaschine noch ansprechbar ist.

    3. Implementieren Sie eine aktivierbare Variante Ihrer Angebots- und Preissuchmaschinen-Implementierung.


  3. Aufgabe:
    In dieser Aufgaben soll ein Server für eine Meta-Preissuchmaschine auf RMI-Basis implementiert werden, d.h. Anfragen an diese Suchmaschine sollen an weitere Suchmaschinen gestellt werden. Zusätzlich soll die Meta-Preissuchmaschine Antworten von anderen Suchmaschinen zwischenspeichern, um bei Anfragen schneller reagieren zu können. In der oben schon genannten ZIP-Datei finden Sie neben den beiden bereits bekannten Schnittstellen noch die Schnittstelle für ein Verzeichnis von Preissuchmaschinen (PriceEngineRegistry).

    1. Implementieren Sie in Java ein Kommandozeilenprogramm, mit dem Sie Ihre Preissuchmaschine an einem Verzeichnis von Preissuchmaschinen anmelden und wieder abmelden können.

      Aufrufsyntax:

      java -jar price-engine-registry-client.jar <registy-url> register <price-engine-url>
      java -jar price-engine-registry-client.jar <registy-url> list
      java -jar price-engine-registry-client.jar <registy-url> unregister <price-engine-url>

      Beispiel:

      > java -jar price-engine-registry-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngineRegistry register \
      //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngine

      > java -jar price-engine-registry-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngineRegistry list
         Registered price engine URLs:
         1. //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngine

      > java -jar price-engine-registry-client.jar //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngineRegistry unregister \
      //RECHNER.inf.fu-berlin.de:1099/30XX/priceEngine

      Tragen Sie Ihre und andere Preissuchmaschinen in das Verzeichnis //vader.inf.fu-berlin.de/priceEngineRegistry ein. Bedenken Sie, dass Sie für den Rechnernamen nicht localhost, sondern den eigentlichen Namen des Rechners verwenden.


    2. Implementieren Sie erneut die Schnittstelle für eine Preissuchmaschine (PriceEngine), diesmal jedoch als Meta-Preissuchmaschine. Bei Anfragen soll zuerst das Verzeichnis von Preissuchmaschinen angefragt werden, um alle angemeldeten Preissuchmaschinen zu bestimmen, und anschließend das beste Angebot aller Preissuchmaschinen ermittelt werden. Speichern Sie sowohl das Verzeichnis der Preissuchmaschinen sowie die bereits ermittelten Angebote geeignet zwischen, damit einerseits nicht bei jeder Anfrage alle Suchemaschinen abgefragt werden müssen und andererseits der Zwischenspeicher in gewissen Abständen aktualisiert wird (beispielsweise könnten Anfragen erneut gestellt, wenn der Eintrag zu einem Angebot über eine Stunde alt ist; siehe java.util.Calendar).
      Schreibzugriffe (enter und clear) auf Ihre Meta-Suchmaschine sollen nicht auf allen anderen Suchmaschinen ausgeführt werden, sondern nur die lokalen Einträge wie bei Aufgabe 2b) verändern.
      Melden Sie Ihre Meta-Suchmaschine nicht im Verzeichnis der Preissuchmaschinen an, um Zirkel bei Anfragen zu verhindern.

      Aufrufsyntax:

      java -jar meta-price-engine-server.jar <registry-url>

      Beispiel (sofern Ihre Gruppenr. 23 ist):

      > java -jar meta-price-engine-server.jar //localhost/3023/metaPriceEngine

      Zum Testen eignet sich natürlich wieder der Klient von Aufgabe 1b).

  4. Aufgabe:
    Schreiben Sie ein Objekt, dass eine Zeichenkette speichern kann und von außen durch Methoden mit der Typisierung
    public void set(String s) und public String get() zugänglich ist. Das Objekt soll eine geeignete Schnittstelle ReplicatedString implementieren. Ein abgespeicherter String soll aber in einem zweiten, entfernten Objekt repliziert, also identisch gespeichert werden. Dieses Objekt soll mit der Methode public void replicateAt(ReplicatedString rs) einstellbar sein. Die Objekte sollen sich geeignet in der lokalen Registry registrieren. Zum Testen sollen Sie mehreren Programmen entsprechende Objekt a und b erzeugen (und registrieren) und dafür sorgen, dass der Inhalt von a auch auf b repliziert wird. Sie sollten dann eine Zeichenkette auf a speichern und danach den Inhalt von a und b testweise ausgeben.
 
Zum Bestehen des Blattes ist es erforderlich, dass
  • Alle Aufgaben bearbeitet wurden und davon
  • Aufgaben 1, 2.1, 2.2 und 3 funktionieren

Die Abgabe der Lösungen erfolgt auf zwei Wegen
  • Abgabe auf Papier:
Bitte schreiben Sie zur jeder Aufgabe eine Dokumentation, in der Sie anhand von *relevanten* Codefragmenten Ihre Implementierung erläutern. Die Codefragmente sollten möglichst kurz gehalten werden und nur der Orientierung für den Leser dienen; entscheidend sind Ihre Erläuterungen, was diese Fragmente machen und wieso Sie sich für diese Art der Implementierung entschieden haben. Erläutern Sie auch, welche Art der Fehlerbehandlung Sie vorgenommen haben, insbesondere bezüglich der Fehler, die erst bei verteilten Systemen auftreten. Die Dokumentation ist in den Fächern der Tutoren abzugeben. 
  • Abgabe per E-Mail:
Schicken Sie ein Archiv an Ihren Tutor, welches den vollständigen Quellcode enthält. Der Betreff der E-Mail sollte wie folgt anfangen:
"[ALP5] Gruppe X ....".

 

Diskussionsaufgaben, die nicht als Abgabe beantwortet werden sollen. Wir diskutieren sie in der Übung, Sie sollten sich im Rahmen dieser Aufgaben auf die Klausur vorbereiten.

Block Client-Server
  1. Was macht das Interaktionsmodell bei Client-Server aus?
  2. Welche Varianten der Interaktion gibt es?
  3. Beschreiben Sie zwei grundsätzliche Eigenschaften von Servern bezüglich Zustand und Nebenläfigkeit

Block RPC
  1. Was ist der Remote Procedure Call
  2. Was synchronisiert sich bei RPC womit?
  3. Nennen Sie fünf Unterschiede zwischen lokalem und entferntem Prozeduraufruf
  4. Wie läuft ein RPC ab?
  5. Was ist ein asynchroner RPC?
  6. Welche Komponenten sind bei einem RPC generell beteiligt
  7. Was ist ein Stub?
  8. Was ist eine Schnittstelle?
  9. Nennen Sie drei Arten von Bindung zwischen Aufrufer und Aufgerufenem
  10. Was macht ein Trader oder Broker?
  11. Nennen Sie vier Fehlerquellen die spezifisch für RPC sind.
  12. Was bedeutet die at-most-once Semantic beim RPC?
Block RMI
  1. Wie läuft der Aufruf einer Methode an einem entfernten Objekt in RMI ab?
  2. Nennen Sie zwei Unterschiede eines Interfaces für ein RMI Objekt zu einem Interface für lokale Obejekt bei gleicher Funktionalität.
  3. Wovon erbt ein Objekt, das per RMI aufrufbar sein soll?
  4. Wie unterscheidet sich der Aufruf einer Method an einem RMI Objekt von dem an einem lokalen Objekt?
  5. Was macht das rmic Programm?
  6. Welche Komponente übernimmt die Rolle des Brokers bei RMI?
  7. Wie kommt ein Client-Objekt zu einer Referenz auf ein entferntes Objekt?
  8. Welches URL-Schema bezeichnet RMI Objekte und wie ist es aufgebaut?
  9. Wie findet man eine Registry auf?
  10. Was ist Serialisierung und warum ist sie bei RMI notwendig?
  11. Welches Sicherheitsproblem entsteht durch Objektserialisierung?
  12. Was ist ein Callback und was muss man in RMI dafür tun?
  13. Was ist ein Multiserver?
  14. Wieviele Threads können in einem RMI-Objekt aktiv sein?
  15. Was ist Aktivierung und wie funktioniert sie in Java RMI?