2017-01-30 2 views
0

je l'exemple de code suivant:Regarder pas acteur de l'enfant à l'échec en raison d'une exception

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" 

} 

Est-il possible d'une certaine manière de surveiller l'échec ActorToWatch (est exception a été levée) sans en faire l'enfant de WatchingActor? Dans cet exemple, "acteur regardé mort" n'est pas imprimé, je suppose que ActorToWatch est redémarré sur excpetion, au lieu de s'arrêter. Comment gérer l'échec de l'acteur observé qui n'est pas un enfant?

Répondre

1

Vous avez raison, ActorToWatch est redémarré après une défaillance. Et c'est parce que la stratégie de supervision par défaut pour le Guardian Actor est de le redémarrer. Vous pouvez changer la stratégie du Guardian pour - par exemple. - un arrêt, en appliquant la configuration suivante dans votre application.conf. Vous pouvez concevoir des stratégies plus complexes, mais celle-ci devrait déclencher votre deathwatch.

Pour plus d'informations sur la supervision, voir le docs.

+0

Est-il possible de changer de stratégie de supervision pour un acteur spécifique, qui n'est pas un enfant de WatchingActor? –

+0

Vous pouvez modifier la stratégie de supervision d'un acteur (http://doc.akka.io/docs/akka/current/scala/fault-tolerance.html#Creating_a_Supervisor_Strategy). Si vous souhaitez appliquer un comportement différent en fonction de l'enfant, vous pouvez alors lancer différentes exceptions dans vos enfants pour les distinguer. –

+0

Pourriez-vous l'illustrer dans votre réponse pour être clair. J'ai lu la documentation et il y a écrit, je l'essaie. Cela fonctionne si je fais WatchingActor parent de ActorToWatch. –