监护人中的Akka AllForOne主管策略

时间:2019-03-05 12:03:50

标签: java akka actor supervisorstrategy

我需要一种方法来在其中一个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());
}

0 个答案:

没有答案