2017-01-30 19 views
0

У меня есть следующий код:Смотря не ребенок актера на неудачу из-за исключения

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, а не останавливается. Как справиться с провалом наблюдаемого актера, который не является дочерним?

ответ

1

Вы правы, ActorToWatch перезапускается после сбоя. И это потому, что стратегия надзора для Guardian Actor по умолчанию заключается в ее перезапуске. Вы можете изменить стратегию Хранителя - например, - остановка, путем применения следующей конфигурации в вашем application.conf.

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

Вы можете разработать более сложные стратегии, но этот способ должен быть вызван вашим срабатыванием deathwatch.

Для получения дополнительной информации о наблюдении см. docs.

+0

Можно ли изменить стратегию надзора для одного конкретного актера, который не является дочерью WatchingActor? –

+0

Вы можете изменить стратегию надзора любого актера (http://doc.akka.io/docs/akka/current/scala/fault-tolerance.html#Creating_a_Supervisor_Strategy). Если вы хотите применить различное поведение в зависимости от дочернего элемента, то вы можете захотеть выделить для своих детей разные исключения, чтобы отличить их. –

+0

Не могли бы вы проиллюстрировать это в своем ответе, чтобы быть ясным. Я прочитал документацию, и там написано, я стараюсь. Он работает, если я создаю родительский компонент WatchingActor для ActorToWatch. –