因异常而不看儿童演员失败

时间:2017-01-30 09:32:05

标签: scala akka actor watch

我有以下代码示例:

class WatchingActor(actorToWatch: ActorRef) extends Actor {
  context watch actorToWatch

  override def receive = {
    case _: Terminated =>
      println("watched actor is dead")
  }

}

class ActorToWatch extends Actor {

  override def receive: Receive = {
    case _ => throw new IllegalArgumentException("")
  }
}

object Application extends App {
  implicit val ac = ActorSystem("test-sys")

  val toWatch = ac.actorOf(Props[ActorToWatch])
  val watcher = ac.actorOf(Props(new WatchingActor(toWatch)))

  toWatch ! "lol"

}

是否有可能以某种方式监督ActorToWatch失败(抛出异常)而不使其成为WatchingActor的子项? 在这个样本中“看过演员死了”没有打印,我猜是因为ActorToWatch在激活时重新启动,而不是停止。如何处理非儿童观看演员的失败?

1 个答案:

答案 0 :(得分:1)

你是对的,失败后ActorToWatch重新启动。这是因为Guardian Actor的默认监督策略是重启它。您可以将Guardian的策略更改为 - 例如 - 通过在application.conf中应用以下配置来停止。

actor.guardian-supervisor-strategy = "akka.actor.StoppingSupervisorStrategy"

你可以制定更复杂的策略,但是这个策略应该会触发你的死亡计划。

有关监督的更多信息,请参阅docs