370 likes | 486 Views
Aglets III Praxisbeispiel. im Seminar Softwareagenten Christian Dupuis Colin Wilke. Gliederung. Motivation Workerpool 2.1 Reception 2.2 Worker Clientanwendungen 3.1 MergeSort 3.2 Chatsystem Zusammenfassung. 1 Motivation. Wie schreibe ich ein mobiles Aglet? Tahiti-Server
E N D
Aglets IIIPraxisbeispiel im Seminar Softwareagenten Christian Dupuis Colin Wilke
Gliederung • Motivation • Workerpool 2.1Reception 2.2 Worker • Clientanwendungen 3.1 MergeSort 3.2Chatsystem • Zusammenfassung Seminar Softwareagenten
1 Motivation • Wie schreibe ich ein mobiles Aglet? • Tahiti-Server • HelloWorld-Aglet • extends Aglet • onCreation() • handleMessage() Seminar Softwareagenten
1 HelloWorld Aglet – Praxis Seminar Softwareagenten
2 Workerpool • Ursprünglich geplant: Verteilter Algorithmus • Aber:schlechte Dokumentation des integrierten Lookup-Services (MAFFinder) • Daher:eigenständige Implementierung eines Lookup-Services mit der nötigen Basisfunktionalität Seminar Softwareagenten
2 Workerpool • Basisfunktionalität • An- und Abmelden von Tahiti-Server/Diensten • Lookup von freien Tahiti-Server/Diensten • Konsistenzsicherung durch Lease-Konzept • Exceptionhandling Seminar Softwareagenten
Reception Lease Checker Client ChatServer ChatClients MergeSort MergeSlave HostList Worker Worker Lease Workerpool „Framework“ Anwend- ungen 2 Workerpool Architektur
2.1 Reception Lebenszyklus • onCreation() • initialisieren der HostListhosts = new ReceptionHostList() • erzeugen des LeaseCheckers • run() • warten auf einkommende Messages, z.B. „register“ • onDisposing() • beenden des LeaseCheckers und sich selbst Seminar Softwareagenten
2.1 Reception – Code public boolean handleMessage(Message msg) { […] else if (msg.sameKind("register")) { try { WorkerDetails details = new WorkerDetails([…]); hosts.register(details); } catch (Exception e) { msg.sendException(e); return false; } return true; } else if (msg.sameKind("renewlease")) { try { hosts.renewlease(new URL(msg.getArg("ADRESS").toString())); } catch (Exception e) { msg.sendException(e); return false; } } […] } Reception.java
2.1 Reception LeaseChecker • Aufgabe: Konsistenzerhaltung • prüft periodisch Gültigkeit der Leases. • löscht ggf. abgelaufene Leases bzw. Worker • Realisiert durch Persistenzmechanismus des ASDK Seminar Softwareagenten
2.1 LeaseChecker – Code public void onCreation(Object o) { [..] addPersistencyListener(new PersistencyAdapter() { // if active check leases public void onActivation(PersistencyEvent ev) { // check leases checkLeases(); try { deactivate(15000); } catch (Exception e) {} } // if deactive sleep public void onDeactivating(PersistencyEvent ev){ setText("Deactivated"); } }); [..] } LeaseChecker.java Seminar Softwareagenten
2.1 Reception – Praxis Seminar Softwareagenten
2.2 Worker Aufgaben • Bereitstellung entweder • eines Tahiti-Servers als Host für Clients • eines Dienstleistungs-Agletsfür Clients • Registrierung bei Reception • Regelmäßiges Erneuern des Leases bei der Reception Seminar Softwareagenten
2.2 Worker Lebenszyklus • onCreation() • „Holen“ des Reception-Proxies für spätere Kommunikation • Registrierung bei der Reception per „register“ Message • Erzeugen der Hilfsklasse WorkerLease • onDisposing() • beendet erst sein WorkerLease und dann sich selbst • Wichtig: Damit keine weitere Erneuerung des Leases erfolgt! Seminar Softwareagenten
2.2 WorkerLease Lebenszyklus • onActivation() • Erneuern der Lease per „renewlease“-Message • Deaktiviert sich für festgelegten Zeitraum => onActivation() addPersistencyListener(new PersistencyAdapter() { public void onActivation(PersistencyEvent ev) { Message leaseMessage = new Message("renewlease"); leaseMessage.setArg("ADRESS", getHostingURL()); reception.sendMessage(leaseMessage); deactivate(5000); } […] } WorkerLease.java Seminar Softwareagenten
new Message(„register“) new Message(„renewLease“) Lease 2.2 Worker - Kommunikation Registrierung eines Workers bei der Reception Tahiti 1 Tahiti 2 Reception Worker Worker Lease getProperty(„Reception“) Seminar Softwareagenten
2.2 Worker – Praxis Seminar Softwareagenten
2.2 Worker – Erweiterbarkeit • Bisher: • Bereitstellung einer Tahiti-Umgebung als Host für Clientaufgaben, • z.B. für verteilte Berechnungen mit noch unbekanntem Programmcode • Zusätzlich jedoch erwünscht: • Registrieren beliebiger Anwendungen die Dienste im System anbieten möchten, z.B. ChatServer • Durch Erweiterung der Klasse Worker lässt sich in speziellen Dienste das Framework nutzen Seminar Softwareagenten
2.2 Worker – Erweiterbarkeit /** Used to handle specific worker messages */ protected boolean handleServiceMessages(Message msg) { […] return true; } /** What shall happen when service is registered */ protected void initialize() { […] } /** The name or identifier/signature of the service */ protected void serviceName() { name = "SpecialServiceWorker"; } • Überschreiben von 3 Methoden notwendig • Nötig da direktes überschreiben von onCreation() und handleMessage() Funktionalität zerstören würde Worker.java Seminar Softwareagenten
3 Clients • Clients wurden von uns realisiert als • MergeSort • nutzt freie registrierte Worker zur verteilten Verarbeitung des Sortierens • ChatClient – nutzt ChatServer-Dienst • nutzt konkreten registrierten Services, hier ChatServer, nicht mehr komplette Tahiti-Server Seminar Softwareagenten
3.1 MergeSort • bekannter Sortieralgorithmus • nutzt rekursive Aufteilung des zu sortierenden Arrays zur Arbeitsteilung • Idee:Slave-Aglets werden jeweils mit einer Hälfte des Arrays an freie Worker weiterverteilt Seminar Softwareagenten
3.1 MergeSort – Code […] slave1 = context.createAglet(this.getAgletContext().getHostingURL(), "workerpool.worker.mergesort.MergeWorker", half1); slave2 = context.createAglet(this.getAgletContext().getHostingURL(), "workerpool.worker.mergesort.MergeWorker", half2); // lookup two workers if there is a reception if (reception != null) { Message msg1 = new Message("lookup"); URL adress1 = (URL)reception.sendMessage(msg1); URL adress2 = (URL)reception.sendMessage(msg1); // dispatch those slaves to the worker machines slave1.dispatch(adress1); slave2.dispatch(adress2); […] } MergeSort.java
3.1 MergeSort – Praxis Seminar Softwareagenten
3.2 Chat • Idee: • Multi-User-Chat (ChatServer) • Aufzeigen der verschiedenen Arten der Kommunikation: • peer-to-peer Nachrichten (ChatClient) • synchron • asynchron • multicast Narichten (ChatClientMulitcast) • Umsetzung: • zur Registrierung Erweiterung der Klasse Worker • Überschreiben der oben aufgeführten Methoden Seminar Softwareagenten
3.2.1 ChatClient Lebenszyklus • onCreation() • „lookupServiceByName“-Message an Reception=> Antwort AgletProxy als RemoteRef auf ChatServer • gefundenem ChatServer „register“-Message schicken • run() • „chatten“ per „newtext“-Messages • empfängt „text“-Messages vom ChatServer • onDisposing() • sendet „unregister“-Message an den Server Seminar Softwareagenten
3.2.2 ChatClientMulticast • Idee • Multicast-Messages abonnieren und senden • Nutzung eines Message-Channels zum Empfang von Nachrichten • Besonderheit • keine Registrierung beim ChatServer, da Multicast-Nachrichten anonym empfangen werden können • „chatten“ eigentlich auch ohne ChatServer möglich • ChatSlave nötig der die Multicast-Nachrichten im AgletProxy des ChatServers ließt Seminar Softwareagenten
3.2.2 ChatClientMulticast Lebenszyklus • onCreation() • „lookup“-Message an Reception • Eigenen Slave kreieren und in AgletContext des ChatServers dispatchen • run() • Empfang von „text“-Multicast-Messages vom Slave • Senden der Texteingaben des Users an den Slave Seminar Softwareagenten
3.2.2 ChatClientMulticastSlave Lebenszyklus • onArrival() • Abonnieren der Multicast-Messages • Erneuerung des AgletProxies beim Master, da gewandert • run() • Senden der empfangenen „text“-Messages an seinen Master • Weitergabe der vom Master kommenden neuen Nachrichten per Multicast-Message Seminar Softwareagenten
3.2.2 CCMCSlave - Code • Hinzufügen des Mobility-Listeners für onArrival()-Vorgänge geschieht per: public void onCreation(Object o) { […] addMobilityListener(new MobilityAdapter() { public void onArrival(MobilityEvent ev) { subscribeMessage("text") Message msg = new Message("proxy", getProxy()); try { master.sendOnewayMessage(msg); } catch (Exception r) {;} } }); […] } ChatClientMulicastSlave.java Seminar Softwareagenten
3.2.3 ChatServer Idee: • Bietet ChatClients die Möglichkeit sich zu unterhalten • Kombiniert Multicast- und Peer-To-Peer-Messaging Umsetzung: • Registriert sich als spezieller Dienst bei der Reception • Erbt von Klasse Worker überschreibt drei Methoden Seminar Softwareagenten
new Message(„lookup“, „ChatServer“) AgletProxy ChatServer new Message(„register“, „ChatServer“) 3.2 Chat – Architektur Tahiti 1 Tahiti 2 Tahiti 3 ChatClient Reception ChatServer Worker Lease Tahiti 4 ChatClient Multicast Lease Checker Seminar Softwareagenten
new Message(„register“) URl ChatServer new Message(„lookup“, „ChatServer“) 3.2 Chat – Architektur Tahiti 1 Tahiti 2 Tahiti 3 ChatClient Reception ChatServer Worker Lease Tahiti 4 ChatClient Multicast Lease Checker ChatClient Multicast Slave Seminar Softwareagenten
3.2.3 ChatServer Lebenszyklus • onCreation() • registriet sich unter der Service-Signatur „ChatServer“ bei der Reception • run() • schickt ankommende „newtext“-Messages an alle registrierten Clients per „text“ peer-to-peer- und Multicast-Message • onDisposing() • „unregister“-Message an Reception (von Worker) Seminar Softwareagenten
3.2.3 ChatServer - Code protected void serviceName() { name = "ChatServer"; } protected void initialize() { subscribeMessage("newtext"); } public boolean handleServiceMessages(Message msg) { if (msg.sameKind("newclient")) { clients.add(msg.getArg()); } else if (msg.sameKind("text")) { Enumeration sendTo = clients.elements(); Message textmsg = new Message("text", msg.getArg()); getAgletContext().multicastMessage(textmsg); while (sendTo.hasMoreElements()) { AgletProxy proxy = (AgletProxy)sendTo.nextElement(); proxy.sendOnewayMessage(textmsg); } […] } […]} Seminar Softwareagenten ChatServer.java
new Message(„text“) handleMessage(Message(„text“)) sendMulticast(new Message(„text“)) new Message(„text“) 3.2 Chat – Architektur Tahiti 1 Tahiti 2 Tahiti 3 ChatClient Reception ChatServer Worker Lease Tahiti 4 ChatClient Multicast Lease Checker ChatClient Multicast Slave Seminar Softwareagenten
3.2 Chat – Praxis Seminar Softwareagenten
4 Zusammenfassung • Bewertung • Einfaches Erstellen von Aglets • Proxy-Konzept hat Vor- und Nachteile • Tahiti-Sicherheitskonzept bisher ausgeblendet • Viele Möglichkeiten aufgrund der hohen Kompatibilität von Java • Vielen Dank für eure Aufmerksamkeit! • => Noch Fragen? Seminar Softwareagenten