Aglets III Praxisbeispiel im Seminar Softwareagenten Christian DupuisColin Wilke
Seminar Softwareagenten2 Gliederung 1. Motivation 2. Workerpool 2.1 Reception 2.2 Worker 3. Clientanwendungen 3.1 MergeSort 3.2 Chatsystem 4. Zusammenfassung
Seminar Softwareagenten3 1 Motivation Wie schreibe ich ein mobiles Aglet? Tahiti-Server HelloWorld-Aglet extends Aglet onCreation() handleMessage()
Seminar Softwareagenten 1 HelloWorld Aglet – Praxis
Seminar Softwareagenten5 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 Softwareagenten6 2 Workerpool Basisfunktionalität 1. An- und Abmelden von Tahiti-Server/Diensten 2. Lookup von freien Tahiti-Server/Diensten Konsistenzsicherung durch Lease-Konzept Exceptionhandling
7 2 Workerpool Reception Lease Checker HostList Worker Lease Client Architektur ChatServerChatClients MergeSortMergeSlave Workerpool Framework Anwend- ungen
Seminar Softwareagenten8 2.1 Reception Lebenszyklus 1. onCreation() initialisieren der HostList hosts = new ReceptionHostList() erzeugen des LeaseCheckers 2. run() warten auf einkommende Messages, z.B. register 3. onDisposing() beenden des LeaseCheckers und sich selbst
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
Seminar Softwareagenten 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 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 Worker Aufgaben Bereitstellung entweder eines Tahiti-Servers als Host für Clients eines Dienstleistungs-Aglets für Clients Registrierung bei Reception Regelmäßiges Erneuern des Leases bei der Reception
Seminar Softwareagenten Worker Lebenszyklus 1. onCreation() Holen des Reception-Proxies für spätere Kommunikation Registrierung bei der Reception per register Message Erzeugen der Hilfsklasse WorkerLease 2. onDisposing() beendet erst sein WorkerLease und dann sich selbst Wichtig: Damit keine weitere Erneuerung des Leases erfolgt!
Seminar Softwareagenten WorkerLease Lebenszyklus 1. 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 Worker - Kommunikation Tahiti 1 Reception Tahiti 2 Worker getProperty(Reception) new Message(register)Lease Worker Lease new Message(renewLease) Registrierung eines Workers bei der Reception
Seminar Softwareagenten 2.2 Worker – Praxis
Seminar Softwareagenten 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 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"; } Worker.java Überschreiben von 3 Methoden notwendig Nötig da direktes überschreiben von onCreation() und handleMessage() Funktionalität zerstören würde
Seminar Softwareagenten20 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 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
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
Seminar Softwareagenten 3.1 MergeSort – Praxis
Seminar Softwareagenten 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 ChatClient Lebenszyklus 1. onCreation() lookupServiceByName-Message an Reception => Antwort AgletProxy als RemoteRef auf ChatServer gefundenem ChatServer register-Message schicken 2. run() chatten per newtext-Messages empfängt text-Messages vom ChatServer 3. onDisposing() sendet unregister-Message an den Server
Seminar Softwareagenten 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 ChatClientMulticast Lebenszyklus 1. onCreation() lookup-Message an Reception Eigenen Slave kreieren und in AgletContext des ChatServers dispatchen 2. run() Empfang von text-Multicast-Messages vom Slave Senden der Texteingaben des Users an den Slave
Seminar Softwareagenten ChatClientMulticastSlave Lebenszyklus 1. onArrival() Abonnieren der Multicast-Messages Erneuerung des AgletProxies beim Master, da gewandert 2. run() Senden der empfangenen text-Messages an seinen Master Weitergabe der vom Master kommenden neuen Nachrichten per Multicast-Message
Seminar Softwareagenten 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 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 Chat – Architektur Tahiti 1Tahiti 3 Reception ChatClient Tahiti 4 ChatClient Multicast Tahiti 2 ChatServer Worker Lease Checker new Message(register, ChatServer)new Message(lookup, ChatServer) AgletProxy ChatServer
Seminar Softwareagenten Chat – Architektur Tahiti 1Tahiti 3 Reception ChatClient Tahiti 4 ChatClient Multicast Tahiti 2 ChatServer ChatClient Multicast Slave Worker Lease Checker new Message(register) new Message(lookup, ChatServer) URl ChatServer
Seminar Softwareagenten ChatServer Lebenszyklus 1. onCreation() registriet sich unter der Service-Signatur ChatServer bei der Reception 2. run() schickt ankommende newtext-Messages an alle registrierten Clients per text peer-to-peer- und Multicast-Message 3. onDisposing() unregister-Message an Reception (von Worker)
Seminar Softwareagenten 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); } […] } […]} ChatServer.java
Seminar Softwareagenten Chat – Architektur Tahiti 1Tahiti 3 Reception ChatClient Tahiti 4 ChatClient Multicast Tahiti 2 ChatServer ChatClient Multicast Slave Worker Lease Checker new Message(text) sendMulticast(new Message(text)) new Message(text) handleMessage(Message(text))
Seminar Softwareagenten 3.2 Chat – Praxis
Seminar Softwareagenten37 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! Vielen Dank für eure Aufmerksamkeit! => Noch Fragen? => Noch Fragen?