pp.11.02-RouterFindWords
Paralleles Suchen/Finden eines Suchstrings in sehr vielen Textdateien mit einem Router
- Projekt:
pp.11.02-RouterFindWords
- Bearbeitungszeit: 35 Minuten
- Musterlösung: 15 Minuten
- Kompatibilität: mindestens Java SE 16
Aufbauend auf der Musterlösung von pp.11.01-FindWords
soll ein Aktor-System mit der Verwendung eines Routers entwickelt werden.
Das Aktor-System besteht aus drei unterschiedlichen Aktor-Typen (Klassen):
pp.MasterActor
(muss geändert werden) – genau einmalpp.ListenerActor
– genau einmalpp.WorkerActor
– von diesen Aktoren wird es mehrere Instanzen geben. Diesmal aber weniger als die Anzahl der zu durchsuchenden Dateien.
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. Außerdem muss es einen Router mit Round Robin Entscheidungslogik geben. Die WorkerActor
-Instanzen fungieren als Routees dieses Routers.
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). Außerdem wird der Router durch new(w1,w2)
erzeugt. Damit ist gemeint, dass eine Router-Instanz gebildet wird und dass ihr w1
und w2
als Routees zugewiesen werden.
Die Aktivierung der Lebenslinien der Worker ist hier wieder wie bei der vorigen Laborübungsaufgabe 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.
In diesem Diagramm hat auch der Router Aktivierungen auf der Lebenslinie. Das soll hier andeuten, dass jeweils eine WorkMsg
, die beim Router ankommt, an einen Worker weitergereicht wird. Nach dem Routen endet die Aktivierung und es wird auf die nächste WorkMsg
zum Weiterleiten gewartet.
Um die Darstellung übersichtlich zu halten, ist die Zahl der Worker von fünf auf zwei Aktoren und der Umfang des Auftrags von acht auf drei Dateien reduziert.
- Master erzeugt am Anfang Listener und alle Worker
- Master erzeugt dann einen Router, dem die Worker als Routees übergeben werden
- eine
FindMsg
kommt beim Master an - die drei darin enthaltenen Dateien werden vom Master als
WorkMsg
an den Router geschickt. - Router sendet erste und zweite
WorkMsg
an w1 und w2 - die dritte
WorkMsg
geht vom Router wieder wegen Round Robin-Logik an w1 - Master sammelt drei
ResultMsg
ein und sendet Gesamtergebnis alsResultMsg
an Listener
Aufgaben
- Bauen Sie einen Router ein, der beliebig viele Aufträge auf n
WorkerActor
verteilt und dabei dieRoundRobinRoutingLogic
verwendet. - Es empfiehlt sich die Routees, den Router und die Verbindung zwischen ihnen im Konstruktor von
MasterActor
zu erzeugen. - Die Routees sind
WorkerActor
-Instanzen. Es ist sinnvoll, eine feste Anzahl von ihnen in einer Schleife zu erzeugen. - Als Router-Verhalten soll Round Robin verwendet werden.
- Verdoppeln Sie die Anzahl der Dateien, in denen gesucht werden soll, indem Sie Kopien der vier gegebenen Dateien erstellen. Dafür muss auch
Main
geändert werden. - Sehen Sie weniger Routees als Dateien vor, damit gezeigt werden kann, dass Ihr Programm mit einer festen Anzahl von
WorkerActor
-Instanzen eine beliebige Anzahl von (Teil-) Aufgaben lösen kann.