2015-08-13 1 views
1

Compte tenu d'un système d'acteur à base Akka.net avec une structure de base comme:Akka.net - traitement des erreurs supplémentaires par le coordinateur

/user 
    /coordinator 
    /child (x1000, with RoundRobinPool router) 

acteur coordonnateur définit la stratégie de supervision avec Directive.Restart utilisée.

Les acteurs enfants peuvent échouer pour plusieurs raisons (par exemple, avec ArithmeticException, InvalidOperationException et MyCustomException).

Mais quand un enfant échoue avec MyCustomException, j'aimerais avoir la possibilité de le gérer d'une manière ou d'une autre sans changer le mécanisme de supervision par défaut (l'approche de redémarrage devrait toujours fonctionner ici). Par exemple, pour ajouter Console.Writeline avec les détails d'exception.

Comment l'implémenter?

Répondre

1

En général MyCustomException signaux, que vous êtes en charge lorsque l'exception se produit, et vous pouvez le connecter tout de suite dans votre logique enfant, sans avoir besoin de l'élever au parent. Mais si ce n'est pas possible, vous pouvez définir votre propre classe de stratégie de superviseur comme ceci:

public class MySupervisorStrategy : OneForOneStrategy 
{ 
    public MySupervisorStrategy(ILoggingAdapter log) : base(reason => 
     { 
      if (reason is MyCustomException) 
      { 
       log.Error(reason.Message); 
       return Directive.Restart; 
      } 

      return Akka.Actor.SupervisorStrategy.DefaultDecider.Decide(reason); 
     }) 
    { 
    } 
} 

Il y a deux façons comment l'appliquer à votre acteur:

  1. Utilisez Props.Create<MyActor>().WithSupervisorStrategy(new MySupervisorStrategy(system.Log) pour l'appliquer directement à partir de votre acteur système.
  2. Attachez-le directement dans la logique de l'acteur en remplaçant la méthode SupervisorStrategy d'un acteur (utilisez Context.GetLogger() pour recevoir l'instance de journal pour l'acteur actuel).

La deuxième option est moins flexible mais fonctionnera probablement mieux dans les situations où vous devez utiliser des scénarios de déploiement à distance.

+0

vous aviez certainement raison dès la première phrase, c'était une solution pour moi, mais merci pour les deux approches de travail –