Akka的新手问题 - 我正在阅读Akka Essentials,有人可以解释一下Akka Stop / Poison Pill与Kill之间的区别吗?这本书只提供了一个小小的解释“杀死同步与毒药是异步的” . 但是以什么方式?调用actor是否在此期间锁定线程?儿童演员是否在杀人,后停止等情况下被通知?一个概念与另一个概念的使用示例?
非常感谢!
stop 和 PoisonPill 都将终止actor并停止消息队列 . 它们将导致actor停止处理消息,向其所有子节点发送停止调用,等待它们终止,然后调用它的 postStop 钩子 . 所有其他消息都将发送到死信邮箱 .
stop
PoisonPill
postStop
不同之处在于在此序列开始之前处理消息 . 在 stop 调用的情况下,首先完成当前正在处理的消息,并丢弃所有其他消息 . 发送 PoisonPill 时,这只是队列中的另一条消息,因此序列将在收到 PoisonPill 时开始 . 将首先处理队列中前面的所有消息 .
相比之下, Kill 消息导致actor抛出 ActorKilledException ,使用普通的管理程序机制处理它 . 因此,此处的行为取决于您在主管策略中定义的内容 . 默认是停止actor . 但是邮箱仍然存在,因此当actor重新启动时,它仍然会有旧消息,除了导致失败的消息 .
Kill
ActorKilledException
另请参阅文档中的“停止演员”,“杀死演员”部分:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
更多关于监管策略:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
尽可能使用PoisonPill . 它被放在邮箱上,像任何其他消息一样被消费 . 您还可以在actor中使用“context.stop(self)” .
在PoisonPill之前,PoisonPill在完成所有收到邮箱的邮件后,会异步停止该角色 .
3 回答
stop
和PoisonPill
都将终止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
尽可能使用PoisonPill . 它被放在邮箱上,像任何其他消息一样被消费 . 您还可以在actor中使用“context.stop(self)” .
在PoisonPill之前,PoisonPill在完成所有收到邮箱的邮件后,会异步停止该角色 .