我有以下代码示例:
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在激活时重新启动,而不是停止。如何处理非儿童观看演员的失败?
答案 0 :(得分:1)
你是对的,失败后ActorToWatch
重新启动。这是因为Guardian Actor的默认监督策略是重启它。您可以将Guardian的策略更改为 - 例如 - 通过在application.conf
中应用以下配置来停止。
actor.guardian-supervisor-strategy = "akka.actor.StoppingSupervisorStrategy"
你可以制定更复杂的策略,但是这个策略应该会触发你的死亡计划。
有关监督的更多信息,请参阅docs。