Akka Kill vs. Stop vs. Poison Pill?

时间:2012-12-12 20:22:11

标签: scala akka

Akka的新手问题 - 我正在阅读Akka Essentials,有人可以解释一下Akka Stop / Poison Pill与Kill之间的区别吗?这本书只提供了一个小小的解释“杀死同步与毒药是异步的”。但是以什么方式?调用actor是否在此期间锁定线程?儿童演员是否在杀戮,后停止等情况下被通知?一个概念与另一个概念的使用示例?

非常感谢!

4 个答案:

答案 0 :(得分:320)

stopPoisonPill都将终止actor并停止消息队列。它们将导致actor停止处理消息,向其所有子节点发送停止调用,等待它们终止,然后调用其postStop挂钩。所有其他消息都将发送到死信箱。

区别在于此序列开始之前处理的消息。在stop呼叫的情况下,首先完成当前正在处理的消息,并丢弃所有其他消息。发送PoisonPill时,这只是队列中的另一条消息,因此序列将在收到PoisonPill时开始。将首先处理队列中前面的所有消息。

相比之下,Kill消息导致actor抛出ActorKilledException,使用普通的管理机制来处理它。因此,此处的行为取决于您在主管策略中定义的内容。默认是停止actor。但是邮箱仍然存在,所以当actor重新启动时,它仍然会有旧消息,除了导致失败的消息。

另请参阅文档中的“停止演员”,“杀死演员”部分:

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

更多关于监管策略:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html

答案 1 :(得分:1)

尽可能使用PoisonPill。它被放在邮箱上,像任何其他消息一样被消费。你也可以使用" context.stop(self)"来自演员。

答案 2 :(得分:0)

您可以同时使用actor stop和poison pill来停止对actor的处理,并杀死可以完全终止actor。 x.stop是您在akka接收方法中进行的调用,仅在调用postStop之后用新角色替换角色状态。 X ! PoisonPill是一种在actor运行时传递给actor以停止处理的方法(推荐)。在调用postStop之后也将替换actor状态。 x.kill将终止演员,并将演员路径中的演员删除,并将整个演员替换为新的演员。

答案 3 :(得分:-1)

在PoisonPill之前,PoisonPill在完成所有收到邮箱的邮件后,会异步停止该角色。