使用管道模式时,让演员向自己发送毒药

时间:2017-07-12 14:27:44

标签: scala akka

我有以下演员

class FooActor(name: String) extends Actor {
  def receive = {
    case msg: Bar => 
      val x : Future[List[T]] = makeDBCall()
      x pipeTo sender()
    case _ => 
  }
}

我想要的是在pipeTo操作成功将列表发送给发件人之后,actor实例终止了自己。

我对自我有点犹豫不决!毒药消息只是在管道的下一行,因为我不明白pipeTo是如何工作的。

如果pipeTo阻止直到将来完成,那么也许就是自我!下一行的毒药是安全的。

但是如果pipeTo是非阻塞的并且它通过回调执行,那么调用self!下一行中的毒药会过早杀死演员。

1 个答案:

答案 0 :(得分:3)

检查pipeTo is implemented

的方式
  final class PipeableFuture[T](val future: Future[T])(implicit executionContext: ExecutionContext) {
    def pipeTo(recipient: ActorRef)(implicit sender: ActorRef = Actor.noSender): Future[T] = {
      future andThen {
        case Success(r) ⇒ recipient ! r
        case Failure(f) ⇒ recipient ! Status.Failure(f)
      }
    } 
// ...

基本上,它会在未来完成后将消息发送给收件人并返回另一个未来。所以它是异步的并且放置自己!下一行的PoisonPill不会像你期望的那样工作。

这样的事情应该可以解决这个问题:

x.pipeTo(sender()).onSuccess { case _ =>
  self ! PoisonPill
}