1

我需要一种方法来停止一个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());
}
4

0 回答 0