2016-08-06 54 views
2

Ich möchte nach Muster fragen, wenn es erforderlich ist, Schauspieler Staat aus der Datenbank zu initiieren. Ich habe ein DAO, das Future [...] zurückgibt und normalerweise keine blockierende Nachricht sollte an den Schauspieler gesendet werden, um die Zukunft abzuschließen. Aber dieser Fall ist anders. Ich kann keine Nachricht vom Postfach des Schauspielers empfangen, bevor die Initialisierung abgeschlossen ist. Ist der einzige Weg, den Actor-Thread zu blockieren, während auf die Datenbank-Zukunft gewartet wird?Akka Schauspieler lesen Zustand aus der Datenbank

Antwort

3

Der einfachste Weg wäre, zwei Empfangsverfahren zu definieren, z. initializing und initialized, beginnend mit def receive = initializing. Innerhalb Ihres inizializing Kontexts könnten Sie einfach eine Nachricht wie InitializationNotReady zurücksenden, um dem anderen Schauspieler zu sagen, dass er es später erneut versuchen sollte. Nachdem Ihr Akteur initialisiert wurde, wechseln Sie Ihren Kontext mit context become initialized in den neuen Zustand, in dem Sie normal arbeiten können.

Schließlich könnte ein anderer guter Ansatz sein, sich Akka Persistence anzusehen. Er ermöglicht zustandsorientierten Akteuren, ihren internen Status beizubehalten, damit sie wiederhergestellt werden können, wenn ein Akteur nach einem JVM-Absturz oder von einem Supervisor gestartet oder neu gestartet oder in einem Cluster migriert wird.

In diesem Fall können Sie Ihren Status aus einer Datenbank wiederherstellen, da es mehrere Speicheroptionen für Akka-Persistenz gibt. Sie können sie here finden. Nach dieser Wiederherstellung können Sie Nachrichten erhalten, die Sie gewohnt sind.

+0

Akka Persistenz sieht gut aus für meinen Fall, aber ich brauche keine Ereignisquellen und zusätzlichen Speicher für Snapshot. Ich würde gerne einen Schnappschuss von meiner vorhandenen Tabelle lesen, ist das möglich? Das Ändern des Actor-Status passt nicht zu meinem Anwendungsfall, da Nachrichten vom regulären Code (Feuer und Vergessen) und nicht vom separaten Akteur gesendet werden. – user2860204

+1

Dann können Sie versuchen, wenn 'stash' in Ihrem Fall hilft. Wenn Sie Ihren Actor starten, können alle eingehenden Nachrichten gespeichert werden. Nachdem die Initialisierung abgeschlossen ist, können Sie alle empfangenen Nachrichten auflösen, sodass es so aussieht, als ob sie alle jetzt empfangen wurden. In den Dokumenten http://doc.akka.io/docs/akka/current/scala/actors.html#Stash können Sie etwas über das Stashing nachlesen –