在持久化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调用。问题是这些命令可能同时出现,所以我需要某种锁定系统:
答案 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
有点奇怪,因为它需要一个我不需要的事件。但它看起来仍然比我的解决方案更自然。