我设计了一个演员系统主管策略,如下所示。
MyTopSupervisor
是所有参与者的超级主管,以及从子角色升级的所有错误。
我的问题是:我应该处理在顶级主管的儿童演员中升级,重启和停止的所有错误吗?
含义:
我应该重复MyOtherSupervisor
中MyTopSupervisor
处理的所有错误,还是处理MyOtherSupervisor
中的低级错误,escalated
只处理MyTopSupervisor
错误?
class MyTopSupervisor extends UntypedActor {
private static SupervisorStrategy strategy = new AllForOneStrategy(2,
Duration.create(5, TimeUnit.MINUTES),
new Function<Throwable, Directive>() {
@Override
public Directive apply(Throwable t) {
if (t instanceof SQLException) {
log.error("Error: SQLException")
return restart()
} else if (t instanceof IllegalArgumentException) {
log.error("Error: IllegalArgumentException")
return stop()
} else {
log.error("Error: GeneralException")
return stop()
}
}
});
@Override
public SupervisorStrategy supervisorStrategy() { return strategy }
@Override
void onReceive(Object message) throws Exception {
// CREATE A CHILD OF MyOtherSupervisor
// WATCH THE CHILD
// do something with message
}
}
class MyOtherSupervisor extends UntypedActor {
private static SupervisorStrategy strategy = new OneForOneStrategy(2,
Duration.create(5, TimeUnit.MINUTES),
new Function<Throwable, Directive>() {
@Override
public Directive apply(Throwable t) {
if (t instanceof SQLException) {
log.error("Error: SQLException")
return escalate()
} else if (t instanceof IllegalArgumentException) {
log.error("Error: IllegalArgumentException")
return stop()
} else {
log.error("Error: GeneralException")
return escalate()
}
}
});
@Override
public SupervisorStrategy supervisorStrategy() { return strategy }
@Override
void onReceive(Object message) throws Exception {
// do something with message
}
}
答案 0 :(得分:0)
我认为这取决于您尝试对应用程序执行的操作。如果您拥有这些嵌套的主管(TopSupervisor - &gt; MidSupervisor - &gt; ChildWorkerActor)以便具有强大的容错能力,那么我会尝试捕获MidSupervisor中的所有异常并升级真正的异常(显示停止者或意外的)需要由大老板(TopSupervisor)处理。
将其视为百货公司工作中的工作方式。您的员工在场上与客户打交道。当客户遇到问题时,员工无法解决问题,他们会求助于他们的主管。如果主管无法处理,那么他会转向轮班经理或在这种情况下是TopSupervisor。
来自Akka Docs:
......演员自然形成等级制度。一个演员,是监督一个 程序中的某些功能可能希望将其任务分解为 更小,更易于管理的作品。为了这个目的,它开始孩子 它监督的演员。
http://doc.akka.io/docs/akka/2.4.1/general/actor-systems.html#Hierarchical_Structure
所以要回答你的问题,只要你维持一个层次结构,就不会想要在两个主管中复制例外,因为你不必这样做。
我建议您查看Typesafe的网络研讨会/播客和Akka文档。