aglets iii praxisbeispiel im seminar softwareagenten christian dupuiscolin wilke
TRANSCRIPT
Aglets IIIAglets IIIPraxisbeispielPraxisbeispiel
im Seminar Softwareagenten
Christian Dupuis Colin Wilke
Seminar Softwareagenten 2
GliederungGliederung
1. Motivation
2. Workerpool2.1 Reception2.2 Worker
3. Clientanwendungen3.1 MergeSort3.2 Chatsystem
4. Zusammenfassung
Seminar Softwareagenten 3
1 Motivation1 Motivation Wie schreibe ich ein mobiles Aglet?
Tahiti-Server
HelloWorld-Agletextends AgletonCreation()handleMessage()
Seminar Softwareagenten
1 HelloWorld Aglet – Praxis1 HelloWorld Aglet – Praxis
Seminar Softwareagenten 5
2 Workerpool2 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 6
2 Workerpool2 Workerpool
Basisfunktionalität1. An- und Abmelden von Tahiti-Server/Diensten2. Lookup von freien Tahiti-Server/Diensten
Konsistenzsicherung durch Lease-Konzept
Exceptionhandling
7
2 Workerpool2 Workerpool
ReceptionLease
Checker
HostList
WorkerWorkerLease
Client
Architektur
ChatServer ChatClients
MergeSortMergeSlave
Workerpool „Framework“
Anwend-ungen
Seminar Softwareagenten 8
2.1 Reception2.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 – Code2.1 Reception – Codepublic 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 10
2.1 Reception2.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 11
2.1 LeaseChecker – Code2.1 LeaseChecker – Codepublic void onCreation(Object o) { [..]
addPersistencyListener(new PersistencyAdapter() { // if active check leases public void onActivation(PersistencyEvent ev) {
// check leasescheckLeases();
try { deactivate(15000); } catch (Exception e) {} } // if deactive sleep public void onDeactivating(PersistencyEvent ev){ setText("Deactivated"); }
}); [..] } LeaseChecker.java
Seminar Softwareagenten
2.1 Reception – Praxis2.1 Reception – Praxis
Seminar Softwareagenten 13
2.2 Worker2.2 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 14
2.2 Worker2.2 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 15
2.2 WorkerLease2.2 WorkerLease
Lebenszyklus1. 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 16
2.2 Worker - Kommunikation2.2 Worker - Kommunikation
Tahiti 1
Reception
Tahiti 2
Worker
getProperty(„Reception“)
new Message(„register“)Lease
WorkerLease
new Message(„renewLease“)
Registrierung eines Workers bei der Reception
Seminar Softwareagenten
2.2 Worker – Praxis2.2 Worker – Praxis
Seminar Softwareagenten 18
2.2 Worker – Erweiterbarkeit2.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 19
2.2 Worker – Erweiterbarkeit2.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"; } Worker.java
Überschreiben von 3 Methoden notwendig Nötig da direktes überschreiben von onCreation() und
handleMessage() Funktionalität zerstören würde
Seminar Softwareagenten 20
3 Clients3 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 21
3.1 MergeSort3.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
3.1 MergeSort – Code3.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 receptionif (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 – Praxis3.1 MergeSort – Praxis
Seminar Softwareagenten 24
3.2 Chat3.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 25
3.2.1 ChatClient3.2.1 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 26
3.2.2 ChatClientMulticast3.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 27
3.2.2 ChatClientMulticast3.2.2 ChatClientMulticastLebenszyklus
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 28
3.2.2 ChatClientMulticastSlave3.2.2 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 29
3.2.2 CCMC3.2.2 CCMCSlave - CodeSlave - 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 30
3.2.3 ChatServer3.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 31
3.2 Chat – Architektur3.2 Chat – Architektur
Tahiti 1 Tahiti 3
ReceptionChatClient
Tahiti 4
ChatClientMulticast
Tahiti 2
ChatServerWorkerLease
LeaseChecker
new Message(„register“, „ChatServer“)new Message(„lookup“, „ChatServer“)AgletProxy ChatServer
Seminar Softwareagenten 32
3.2 Chat – Architektur3.2 Chat – Architektur
Tahiti 1 Tahiti 3
ReceptionChatClient
Tahiti 4
ChatClientMulticast
Tahiti 2
ChatServer
ChatClientMulticast
Slave
WorkerLease
LeaseChecker
new Message(„register“)
new Message(„lookup“, „ChatServer“)
URl ChatServer
Seminar Softwareagenten 33
3.2.3 ChatServer3.2.3 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 34
3.2.3 ChatServer - Code3.2.3 ChatServer - Codeprotected 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 35
3.2 Chat – Architektur3.2 Chat – Architektur
Tahiti 1 Tahiti 3
ReceptionChatClient
Tahiti 4
ChatClientMulticast
Tahiti 2
ChatServer
ChatClientMulticast
Slave
WorkerLease
LeaseChecker
new Message(„text“)
sendMulticast(new Message(„text“))
new Message(„text“)
handleMessage(Message(„text“))
Seminar Softwareagenten
3.2 Chat – Praxis3.2 Chat – Praxis
Seminar Softwareagenten 37
4 Zusammenfassung4 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?