我需要一种方法来停止一个actorSystem中的所有演员,因为其中一个演员出现某些异常。我的想法是更改 Guardian Actor 的默认策略,为收到的每个异常设置一个带有 SupervisorStrategy.stop 的 AllForOneStrategy。
问题是即使在参与者失败时正确加载了 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。如您所见,它的一个子 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());
}