我正在尝试在关闭我的Akka actor系统的两种不同方法之间做出决定:
选项#1:向PoisonPill
(最多用户)演员发送Master
:
val master = actorSystem.actorOf(Props[Master], name = "Master")
// Lots of code doing stuff
master ! PoisonPill
选项#2:创建自定义Shutdown
消息并发送给自定义Killswitch
演员:
case class Shutdown()
class Killswitch extends Actor {
override def receive: Receive = {
case Shutdown =>
context.system.terminate()
}
}
val killswitch = actorSystem.actorOf(Props[Killswitch], name = "Killswitch")
killswitch ! Shutdown
这两种方法之间是否有任何差异,或者它们是否都具有相同的确切结果?
如果它们是真正完全相同的解决方案,我认为我选择的是#1,因为它的编码代码少了一点。想法?
答案 0 :(得分:1)
两者之间存在差异: -
1)PoisonPill将终止actor并停止消息队列。它们将导致actor停止处理消息,向其所有子节点发送停止调用,等待它们终止,然后调用其postStop挂钩。所有其他消息都将发送到死信箱。
Poison Pill不会关闭演员系统。
发送PoisonPill只是队列中的另一条消息,因此序列将在收到PoisonPill时启动。将首先处理队列中前面的所有消息。
另见'停止演员','杀死演员'文档中的部分: http://doc.akka.io/docs/akka/snapshot/scala/actors.html
2)context.system.terminate()将终止整个actor系统而不是单个actor。
理想情况下,您应该使用context.system.terminate()来终止您的actor系统。
答案 1 :(得分:1)
不,它们根本不相同。
PoisonPill
将作为普通邮件在Master
邮箱中发送和排队。在Master
之前发送到PoisonPill
的所有邮件都将照常处理。如果Master
本身没有关闭整个ActorSystem
,则不会关闭actor系统,只有Master
actor会关闭。请注意,即使Master
位于远程actor系统中,这仍然有效。应用程序的关闭方式在很大程度上取决于应用程序的结构。