我需要一种方法来在其中一个Actor发生某些异常时停止actorSystem中的所有actor。 我的想法是更改Guardian Actor的默认策略,对收到的每个异常都设置一个带有SupervisorStrategy.stop的AllForOneStrategy。
问题在于,即使在actor发生故障时正确加载了application.conf,系统仍处于启动状态。
prio-mailbox {
mailbox-type = "main.java.messages.MyPriorityMailbox"
//Other mailbox configuration goes here
}
akka{
actor{
guardian-supervisor-strategy = "main.java.engine.SupervisorStrategyGuardian"
}
}
这是定义监督策略的类
public class SupervisorStrategyGuardian implements SupervisorStrategyConfigurator {
@Override
public SupervisorStrategy create() {
return new AllForOneStrategy(//
10, //
Duration.create("10 seconds"), //
DeciderBuilder //
.matchAny(ex -> SupervisorStrategy.stop())
.build()); }
}
这是Actor生成所有其他可能失败的actor。如您所见,它的子角色之一是否抛出了AskTimeoutException,它会通过Escalade()到达守护者Actor。
@Override
public SupervisorStrategy supervisorStrategy() {
return new OneForOneStrategy(//
10, //
Duration.create("10 seconds"), //
DeciderBuilder //
.match(AskTimeoutException.class, ex -> SupervisorStrategy.escalate()) // here i should stop all actors
// TODO --> check if escalating from maser triggers Actorsystem
.match(RuntimeException.class, ex -> SupervisorStrategy.restart()) //
.build());
}