2016-08-06 29 views
2

我想問一下當需要從數據庫初始化actor狀態時的模式。我有一個DAO,它返回Future和Normaly非阻塞消息應該發送給未來的演員完成。但這種情況是不同的。在初始化完成之前,我無法從actor郵箱收到任何消息。在等待數據庫未來完成時阻止actor線程的唯一方法是?Akka actor從數據庫中讀取狀態

回答

3

最微不足道的方法是定義兩個接收方法,例如, initializinginitialized,從def receive = initializing開始。在您的inizializing環境中,您可以簡單地發回一條消息,如InitializationNotReady,以告訴其他演員稍後再次嘗試。在演員初始化後,您將context become initialized的上下文切換到新狀態,您可以在其中正常運行。

畢竟,另一個好的方法可能是看看Akka Persistence。它使有狀態的角色能夠堅持內部狀態,以便在角色啓動,JVM崩潰後或管理員重新啓動或在羣集中遷移時恢復內部狀態。

在你的情況下,你可以從數據庫中恢復你的狀態,因爲它們是Akka持久性的多個存儲選項。你可以找到它們here。恢復後,您可以收到您習慣的消息。

+0

Akka持久性看起來不錯,但我不需要事件源和額外的快照存儲。我想從我現存的表格中讀取快照,有可能嗎?更改actor狀態與我的用例不匹配,因爲消息將從常規代碼(fire and forget)發送,而不是從單獨的actor中發送。 – user2860204

+1

然後,你可以嘗試'藏匿'是否有助於你的情況。啓動演員時,可以隱藏所有收到的消息。初始化完成後,您可以清除所有收到的消息,以使它看起來像現在都已收到。你可以閱讀關於存儲在文檔http://doc.akka.io/docs/akka/current/scala/actors.html#Stash –