Akka:将PoisonPill发送给Master与终止系统上下文

时间:2018-05-15 12:58:24

标签: scala akka

我正在尝试在关闭我的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,因为它的编码代码少了一点。想法?

2 个答案:

答案 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)

不,它们根本不相同。

  1. PoisonPill将作为普通邮件在Master邮箱中发送和排队。在Master之前发送到PoisonPill的所有邮件都将照常处理。如果Master本身没有关闭整个ActorSystem,则不会关闭actor系统,只有Master actor会关闭。请注意,即使Master位于远程actor系统中,这仍然有效。
  2. 这会关闭当前的actor系统。它阻止所有参与者处理任何进一步的消息。这不适用于远程actor系统。
  3. 应用程序的关闭方式在很大程度上取决于应用程序的结构。