我有以下演员
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!下一行中的毒药会过早杀死演员。
答案 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
}