【发布时间】:2015-12-05 03:24:20
【问题描述】:
我设计了一个actor系统监督策略,如下所示。
MyTopSupervisor 是所有演员的超级主管,所有错误都从子演员升级。
我的问题是:我应该在顶级主管的子角色中处理所有升级、重新启动和停止的错误吗?
含义:
我应该在MyTopSupervisor 中重复由MyOtherSupervisor 处理的所有错误,还是应该在MyOtherSupervisor 中处理低级错误,并且只在MyTopSupervisor 上处理escalated 错误?
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
}
}
【问题讨论】:
-
我认为这取决于您的 MyOtherSupervisor 是否可以根据需要处理异常。您希望您的 MyOtherSupervisor 能够度过异常吗?如果您列出您对设计的一些担忧,也许会有所帮助。
标签: akka