Akka.net - 协调员的其他错误处理

时间:2015-08-13 22:39:51

标签: actor akka.net akka-supervision

给定一个基于Akka.net的actor系统,其基本结构如下:

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

协调员角色定义了使用Directive.Restart的监督策略。

儿童演员可能由于多种原因而失败(例如,使用ArithmeticExceptionInvalidOperationExceptionMyCustomException)。

但是当一个孩子用MyCustomException失败时,我希望能够以某种方式另外处理它而不改变默认的监督机制(重启方法应该仍然在这里工作)。 例如,要添加带有异常详细信息的Console.Writeline

如何实施?

1 个答案:

答案 0 :(得分:1)

在一般MyCustomException信号中,您在发生异常时负责,并且您可以立即在您的子逻辑中将其记录,而无需将其提升为父级。但如果不可能,您可以像这样定义自己的主管策略类:

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);
        })
    {
    }
}

如何将它应用于您的演员有两种方法:

  1. 使用Props.Create<MyActor>().WithSupervisorStrategy(new MySupervisorStrategy(system.Log)直接从您的actor系统应用它。
  2. 通过覆盖actor的SupervisorStrategy方法直接将其附加到actor的逻辑中(使用Context.GetLogger()接收当前actor的日志实例)。
  3. 第二个选项不太灵活,但在需要使用远程部署方案的情况下可能会更好。