У меня есть следующий код:Смотря не ребенок актера на неудачу из-за исключения
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 перезапускается на excpetion, а не останавливается. Как справиться с провалом наблюдаемого актера, который не является дочерним?
Можно ли изменить стратегию надзора для одного конкретного актера, который не является дочерью WatchingActor? –
Вы можете изменить стратегию надзора любого актера (http://doc.akka.io/docs/akka/current/scala/fault-tolerance.html#Creating_a_Supervisor_Strategy). Если вы хотите применить различное поведение в зависимости от дочернего элемента, то вы можете захотеть выделить для своих детей разные исключения, чтобы отличить их. –
Не могли бы вы проиллюстрировать это в своем ответе, чтобы быть ясным. Я прочитал документацию, и там написано, я стараюсь. Он работает, если я создаю родительский компонент WatchingActor для ActorToWatch. –