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.PleaseCleanupAndStoppp.messages.FindMsgpp.messages.WorkMsgpp.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
FindMsgkommt beim Master an - die drei darin enthaltenen Dateien werden vom Master als
WorkMsgan den Router geschickt. - Router sendet erste und zweite
WorkMsgan w1 und w2 - die dritte
WorkMsggeht vom Router wieder wegen Round Robin-Logik an w1 - Master sammelt drei
ResultMsgein und sendet Gesamtergebnis alsResultMsgan Listener
Aufgaben
- Bauen Sie einen Router ein, der beliebig viele Aufträge auf n
WorkerActorverteilt und dabei dieRoundRobinRoutingLogicverwendet. - Es empfiehlt sich die Routees, den Router und die Verbindung zwischen ihnen im Konstruktor von
MasterActorzu 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
Maingeä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.
