pp.11.01-FindWords
Paralleles Suchen/Finden eines Suchstrings in einigen wenigen Textdateien
- Projekt:
pp.11.01-FindWords - Bearbeitungszeit: 25 Minuten
- Musterlösung: 15 Minuten
- Kompatibilität: mindestens Java SE 16
In dieser Aufgabe entwickeln Sie ein Aktoren-System in Akka, mit dem parallel in mehreren Dateien eine Volltextsuche nach einem Schlüsselwort durchgeführt werden kann.
Das Aktor-System besteht aus drei unterschiedlichen Aktor-Typen (Klassen):
pp.MasterActor– genau einmalpp.ListenerActor– genau einmalpp.WorkerActor– von diesen Aktoren wird es mehrere Instanzen geben und zwar genau ein Worker pro zu durchsuchender Datei
Zwischen den Aktoren werden vier unterschiedliche Nachrichten-Typen ausgetaucht:
pp.messages.PleaseCleanupAndStoppp.messages.FindMsgpp.messages.WorkMsgpp.messages.ResultMsg
Der Master erzeugt die Worker und den Listener als Kinder und überwacht sie.
Ablauf
Im folgenden Sequenzdiagramm ist ein exemplarischer Ablauf des Aktor-Systems dargestellt.
Die gestrichelten “new”-Pfeile sollen symbolisieren, dass Aktoren erzeugt werden (tatsächlich unter Verwendung der Methode actorOf im Kontext des Master-Aktors).
Die Aktivierung der Lebenslinien der Worker ist hier nicht im üblichen Sinn gemeint. Es handelt sich um die Bearbeitung einer WorkMsg, an deren Ende das Senden einer ResultMsg-Nachricht an den Master steht. Das ist im UML-Sinn kein return, daher wird als Pfeil-Typ \(\to\) auch zum Zurücksenden des Ergebnisses verwendet. Die Aktivierung der Lebenslinie soll hier nur verdeutlichen, dass der Worker an dieser Stelle arbeitet.
Um die Darstellung übersichtlich zu halten, ist die Zahl der Worker von vier auf drei Aktoren und der Umfang des Auftrags von vier auf drei Dateien reduziert.
- Master erzeugt Listener
FindMsgmit drei zu durchsuchenden Dateien trifft beim Master ein- Master erzeugt jeweils Worker und sendet eine
WorkMsgan ihn - Worker durchsucht Datei aus
WorkMsgund sendet Ergebnisse alsResultMsgan Master zurück - Master sammelt alle Antworten, erzeugt daraus eine Gesamt-
ResultMsgund schickt sie an den Listener - Listener gibt Gesamtergebnis auf Konsole aus und terminiert Anwendung
Aufgaben
Vervollständigen Sie die Klassen MasterActor und ListenderActor:
- Erstellen Sie die neue Klasse
ListenerActorin Packagepp. Sie soll von der Klasseakka.actor.AbstractActorerben undResultMsg-Objekte empfangen können. Beim Empfang solch einer Nachricht sollen alle Elemente des PropertiesResultausgegeben werden. Danach soll das gesamte System mitgetContext().getSystem().terminate();heruntergefahren werden. - Ein
ListenerActorsoll im Konstruktor vonMasterActorerzeugt werden und in der Instanzvariablenlistenergespeichert werden. - Der
MasterActorsoll beim Empfang einerFindMsgmitgetFilenames()herausfinden, wie viele Dateien durchsucht werden sollen. Für jede Datei soll ein eigenerWorkerActorerzeugt werden, dem sofort mittelleine neueWorkMsgmit dem entsprechenden Auftrag geschickt wird. - Der
WorkerActorsoll eine Nachricht vom TypResultMsgan denMasterActorzurücksenden, wenn er fertig ist. In derResultMsgsoll das Ergebnis (lokale Variableresult) enthalten sein.
