Praktikum aus Softwareentwicklung 2 SS 2009 Name: Matr.Nr.: Ziel-Repository: svn://www.ssw.uni-linz.ac.at/2009S/PSW2/<kMatrNr>/branches/ex4/ Abzugeben: Quellcode, auf Papier und elektronisch. Abgabefrist: 15.06.2009 Tutor: Maximal: 100 Punkte Punkte: RMI) Remote-Call-API Immer mehr Programme müssen mit entfernten Rechnern kommunizieren. Entweder um Daten zu laden und zu speichern oder um Services auf diesen Rechnern zu nutzen. In dieser Übung beschäftigen wir uns mit Services, oder „Wie kann ich eine Methode auf einem anderen Rechner aufrufen?“. In Java gibt es dazu mehrere Möglichkeiten: • Webservices o Kommunizieren über XML-Nachrichten. o Technologie-unabhängige Kommunikation ist möglich, zB Java-Server, C#-Client. o Großer Overhead, benötigen viel Infrastruktur, zB Webserver. • Remote Method Invocation (RMI) o Kommuniziert über ein Java spezifisches Protokoll. o Wenig Overhead. • Socket-Verbindung o Versenden von Daten über TCP- oder UDP-Verbindungen. Aufgabe In dieser Übung müssen sie eine einfache RMI-API implementieren. Verwenden sie dazu: Reflection, Networking und Serialization. Entwickeln sie ein einfaches NetzwerkProtokoll für Ihre Bibliothek. Ihre API soll folgende Funktionen bieten: • Exportieren von Objekten unter einem Namen; exportierte Objekte müssen genau ein Interface implementieren. • Importieren von Objekten über einen Namen; die API muss entsprechende Proxies erzeugen. Der Nutzer des Objekts „merkt nicht“, dass es sich um ein Remote-Objekt handelt. • Als Parameter sollen alle primitiven, serialisierbaren und exportierten Objekte möglich sein. • Un-Exportieren von Objekten; neue Klienten bekommen das Objekt nicht mehr, Klienten die bereits eine Referenz auf das Objekt haben sollen das Objekt noch weiter nutzen können. Sobald es keine Klienten mehr gibt soll das Objekt entfernt werden (Garbage Collection). • Garbage Collection; implementieren sie einen Mechanismus (Lease), um festzustellen ob ein Objekt noch benötigt wird. • Aufrufe sollen synchron erfolgen, d.h. der Methodenaufruf blockiert bis er abgeschlossen ist. Punkte Implementieren sie ihr Programm sauber strukturiert, damit sie keine Punkte durch „Kleinigkeiten“ verlieren. • Protokoll (10 Punkte) o Importieren eines Objekts o Aufrufen einer Methode o Erneuern einer Lease. • Exportieren/Importieren von Objekten (20 Punkte) • Aufrufen von Methoden (die Unterpunkte sind „aufbauende Levels“) o Ohne Parameter (10 Punkte) o Mit Rückgabewert (10 Punkte) o Mit Parametern und Rückgabewert (10 Punkte) • Parameter o Primitive und serialisierbare Parameter (10 Punkte) o Exportierte Objekte als Parameter (20 Punkte) • Lease Mechanismus zur Garbage Collection o Renew Lease Nachrichten versenden (10 Punkte) o Bonus: Unbenutzte Objekte aus der Registry entfernen (10 Punkte) Hinweis Auf der Übungshomepage steht eine Beispielanwendung (CalculatorTest.zip) die zeigt wie man eine solche API anwenden kann. Im Beispiel heißt die API Hathor und bietet die folgende Schnittstelle: • static Hathor create(int port) throws IOException o Erstellt eine neue Hathor-Registry, darüber kann man Objekte exportieren und importieren. o Der Parameter Port beschreibt den Netzwerk-Port auf dem Hathor auf Anfragen lauschen soll. • void exportObject(String name, Object obj) throws IOException o Macht ein Objekt unter dem gegeben Namen bekannt. o Das Objekt muss genau ein Interface implementieren. • Object importObject(String host, int port, String name) o Importiert das Objekt mit dem gegebenen Namen vom gegeben Computer. o Erstellt automatisch einen Proxy für das Remote-Objekt. • void stop() o Unterbricht den Hathor-Server-Thread, damit die Anwendung beendet werden kann. • void unexportObject(String name) o Entfernt das Objekt mit dem gegebenen Namen von der Hathor-Registry.