2016-08-06 30 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 –