仅在持久保存所有事件后更新actor状态

时间:2014-12-18 15:01:15

标签: scala akka akka-persistence

在持久化actor的receive方法中,我收到一堆我想要保留的事件,并且只有在所有事件都被持久化之后,再次更新我的状态。我怎么能这样做?

def receive: Receive = {
  ...
  case NewEvents(events) =>
    persist(events) { singleEvent =>
      // Update state using this single event
    }
    // After every events are persisted, do one more thing
}

请注意,persist()调用没有阻塞,因此我不能在此之后放置我的代码。


更新:为什么我需要这个

这些新活动来自外部网络服务。我的持久化actor需要在其状态中存储最后一个事件id,它将在接收命令时用于后续的ws调用。问题是这些命令可能同时出现,所以我需要某种锁定系统:

  • 收到ws call命令:stash next命令直到这个命令完成(即总结一个布尔值)
  • 收到来自ws 的回复:存储它们,更新状态并保存最后一个id,对存储中的所有命令执行另一个单ws调用(我保持命令发送者到能够在完成后回复所有内容)否则不再存储命令。

1 个答案:

答案 0 :(得分:1)

我还没有尝试过defer,我最初的解决方案是向自己发送一条PersistEventsDone消息。这是有效的,因为persist方法将存储所有传入的消息,直到执行所有事件处理程序。如果在此过程中出现了另一个命令,那么在PersistEventsDone之前或之后它是否真的无关紧要:

def receive: Receive = {
  ...
  case PersistEventsDone =>
    ...
  case NewEvents(events) =>
    persist(events) { singleEvent =>
      // Update state using this single event
    }
    self ! PersistEventsDone
}
在我的情况下,

defer有点奇怪,因为它需要一个我不需要的事件。但它看起来仍然比我的解决方案更自然。