给定一个基于Akka.net的actor系统,其基本结构如下:
/user
/coordinator
/child (x1000, with RoundRobinPool router)
协调员角色定义了使用Directive.Restart
的监督策略。
儿童演员可能由于多种原因而失败(例如,使用ArithmeticException
,InvalidOperationException
和MyCustomException
)。
但是当一个孩子用MyCustomException
失败时,我希望能够以某种方式另外处理它而不改变默认的监督机制(重启方法应该仍然在这里工作)。
例如,要添加带有异常详细信息的Console.Writeline
。
如何实施?
答案 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);
})
{
}
}
如何将它应用于您的演员有两种方法:
Props.Create<MyActor>().WithSupervisorStrategy(new MySupervisorStrategy(system.Log)
直接从您的actor系统应用它。 SupervisorStrategy
方法直接将其附加到actor的逻辑中(使用Context.GetLogger()
接收当前actor的日志实例)。第二个选项不太灵活,但在需要使用远程部署方案的情况下可能会更好。