是否可以使用可变状态akka PersistentActor或者我应该使用receiveCommand()而不是receiveRecover()的context.become/unbecome
,因为它将在状态更改之前等待完全恢复。
一般来说,你不能在PersistentActor
中使用context.become
和朋友,因为它们会影响receive
方法,这是由PersistentActor
提供的(并处理一些内部消息,这些消息是实现细节,所以你真的不想复制它)。
比context.become
更明确的可变状态是一个更好的路径。
有一种模式,将所有的可变状态包装成一个单一的不可变对象(例如Scalacase class
),并将命令处理延迟到该对象,它可以像这样简单:
var state: State = ???
override val receiveCommand: Receive = state.processCommand(_)
你可以更进一步,让你的processCommand
方法在State
返回,例如(Seq[Event], () => Try[Unit])
…这实际上与Lagom或Typed Persistence等项目所做的非常接近。