同步(或Future-returning)调用Akka UntypedPersistentActor?

时间:2014-08-11 02:39:32

标签: java akka akka-persistence

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

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

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

我认为相对于一个调用者 kinda 的保证顺序满足了知道何时应用了更改的需要,但是如果更改失败怎么办?如果由于失败而重新启动被调用者,则调用者的消息将被丢弃,状态改变将永远不会发生,并且调用者将不会意识到。看起来将错误返回给调用者并在那里表面会更清晰。

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

1 个答案:

答案 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]