我想通知调用者成功应用发送到我的对象的状态更改命令,该命令扩展了UntypedPersistentActor。
如果我没有持续进行状态更改,我会返回一个带有影响更改的闭包的Future,并让调用者等待它。
Akka" persist()"如果我理解正确的话,调用强制我传入一个异步执行的闭包。如果我返回一个自己调用persist()的Future,我只告诉调用者我已成功将更改排队等待以后的应用程序...不是它已被应用,甚至它的应用程序将成功。
我认为相对于一个调用者 kinda 的保证顺序满足了知道何时应用了更改的需要,但是如果更改失败怎么办?如果由于失败而重新启动被调用者,则调用者的消息将被丢弃,状态改变将永远不会发生,并且调用者将不会意识到。看起来将错误返回给调用者并在那里表面会更清晰。
有没有很好的方法来实现这个目标?
答案 0 :(得分:2)
不要从Future调用persist
。它必须在接收的上下文(线程)中调用,因为它依赖于actor的内部状态来进行内务管理。
最简单的方法是使用来自akka.pattern.ask
的问询模式:
case c: Command =>
persist(Event(c)) { sender() ! e }
// caller:
import akka.pattern.ask
val f: Future[Event] = (persistentActor ? Command()).mapTo[Event]
您还可以使用您的演员可以履行的Promise[T]
并将该承诺的Future[T]
发送给发件人:
case c: Command =>
val p = Promise[Event]()
persist(Event(c)) { e =>
p success e
}
sender() ! p.future // Future[T]