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 einmal
  • pp.ListenerActor – genau einmal
  • pp.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.

Hettel und Tran (2016)

Hettel und Tran (2016)

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 als ResultMsg 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 Package pp. Sie soll von der Klasse akka.actor.AbstractActor erben und ResultMsg-Objekte empfangen können. Beim Empfang solch einer Nachricht sollen alle Elemente des Properties Result ausgegeben werden. Danach soll das gesamte System mit getContext().getSystem().terminate(); heruntergefahren werden.
  • Ein ListenerActor soll im Konstruktor von MasterActor erzeugt werden und in der Instanzvariablen listener gespeichert werden.
  • Der MasterActor soll beim Empfang einer FindMsg mit getFilenames() herausfinden, wie viele Dateien durchsucht werden sollen. Für jede Datei soll ein eigener WorkerActor erzeugt werden, dem sofort mit tell eine neue WorkMsg mit dem entsprechenden Auftrag geschickt wird.
  • Der WorkerActor soll eine Nachricht vom Typ ResultMsg an den MasterActor zurücksenden, wenn er fertig ist. In der ResultMsg soll das Ergebnis (lokale Variable result) enthalten sein.

Literatur

Hettel, Jörg und Manh Tien Tran. 2016. Nebenläufige Programmierung mit Java. Konzepte und Programmiermodelle für Multicore-Systeme. Heildelberg: dpunkt.verlag.