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.PleaseCleanupAndStop
pp.messages.FindMsg
pp.messages.WorkMsg
pp.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
FindMsg
mit drei zu durchsuchenden Dateien trifft beim Master ein- Master erzeugt jeweils Worker und sendet eine
WorkMsg
an ihn - Worker durchsucht Datei aus
WorkMsg
und sendet Ergebnisse alsResultMsg
an Master zurück - Master sammelt alle Antworten, erzeugt daraus eine Gesamt-
ResultMsg
und 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
ListenerActor
in Packagepp
. Sie soll von der Klasseakka.actor.AbstractActor
erben undResultMsg
-Objekte empfangen können. Beim Empfang solch einer Nachricht sollen alle Elemente des PropertiesResult
ausgegeben werden. Danach soll das gesamte System mitgetContext().getSystem().terminate();
heruntergefahren werden. - Ein
ListenerActor
soll im Konstruktor vonMasterActor
erzeugt werden und in der Instanzvariablenlistener
gespeichert werden. - Der
MasterActor
soll beim Empfang einerFindMsg
mitgetFilenames()
herausfinden, wie viele Dateien durchsucht werden sollen. Für jede Datei soll ein eigenerWorkerActor
erzeugt werden, dem sofort mittell
eine neueWorkMsg
mit dem entsprechenden Auftrag geschickt wird. - Der
WorkerActor
soll eine Nachricht vom TypResultMsg
an denMasterActor
zurücksenden, wenn er fertig ist. In derResultMsg
soll das Ergebnis (lokale Variableresult
) enthalten sein.