2

我想通知调用者成功应用了发送到我的对象的状态更改命令,该对象扩展了 UntypedPersistentActor。

如果我不坚持状态更改,我会返回一个带有影响更改的闭包的 Future,并让调用者等待。

如果我理解正确的话,Akka 的“persist()”调用会强制我传入一个将异步执行的闭包。如果我返回一个本身调用persist() 的Future,我只是告诉调用者我已经成功地将更改排队等待以后的应用程序......而不是它已被应用,甚至它的应用程序将成功。

我想关于一个调用者的保证排序有点满足知道何时应用更改的需要,但是如果更改失败怎么办?如果被调用者因为失败而重新启动,调用者的消息将被丢弃,状态改变永远不会发生,调用者将不知情。将错误返回给调用者并在那里显示它似乎会更干净。

有没有好的方法来实现这一目标?

4

1 回答 1

2

不要persist从未来调用。它必须在接收的上下文(线程)中调用,因为它依赖于参与者的内部状态来进行内务处理。

最简单的方法是使用 ask 模式,来自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]您的演员可以履行的 a 并将Future[T]该承诺的一个发送回发送者:

case c: Command =>
  val p = Promise[Event]()

  persist(Event(c)) { e => 
    p success e 
  }

  sender() ! p.future // Future[T]
于 2014-08-11T07:31:27.553 回答