【问题标题】:Akka actor read state from databaseAkka actor 从数据库中读取状态
【发布时间】:2016-08-06 12:01:52
【问题描述】:

当需要从数据库初始化参与者状态时,我想询问模式。我有一个返回 Future[...] 的 DAO,并且通常是非阻塞消息应该在未来完成时发送给参与者。但这种情况不同。在初始化完成之前,我无法从演员邮箱收到任何消息。在等待数据库未来完成时阻塞actor线程的唯一方法是什么?

【问题讨论】:

    标签: akka actor nonblocking


    【解决方案1】:

    最简单的方法是定义两个接收方法,例如initializinginitialized,以 def receive = initializing 开头。在您的inizializing 上下文中,您可以简单地发回一条类似InitializationNotReady 的消息,告诉其他参与者他应该稍后再试一次。在你的actor初始化之后,你用context become initialized将你的上下文切换到新的状态,你可以正常操作。

    毕竟,另一个不错的方法是查看Akka Persistence。它使有状态的 Actor 能够保持其内部状态,以便在 Actor 启动、JVM 崩溃后或由主管重新启动或在集群中迁移时恢复。

    在您的情况下,您可以从数据库中恢复您的状态,因为它们是 Akka 持久性的多种存储选项。你可以找到他们here。恢复后,您就可以像习惯一样接收消息了。

    【讨论】:

    • Akka 持久性看起来很适合我的情况,但我不需要事件溯源和额外的快照存储。我想从现有表中读取快照,可以吗?更改演员状态与我的用例不匹配,因为消息将从常规代码(即发即弃)而不是单独的演员发送。
    • 那么你可以试试stash是否对你有帮助。当启动你的actor时,所有传入的消息都可以被隐藏。初始化完成后,您可以取消存储所有收到的消息,这样看起来它们现在都收到了。您可以在文档doc.akka.io/docs/akka/current/scala/actors.html#Stash 中阅读有关存储的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多