Стратегия руководителя Akka AllForOne у актера-хранителя - PullRequest
1 голос
/ 05 марта 2019

Мне нужен способ остановить всех актеров в системе акторов при определенных Исключениях в одном из Актеров. Моя идея состояла в том, чтобы изменить стратегию по умолчанию для Guardian Actor, установив AllForOneStrategy с SupervisorStrategy.stop для каждого полученного исключения.

Проблема в том, что даже если application.conf правильно загружен, когда актер терпит неудачу, система все еще работает.

prio-mailbox {
  mailbox-type = "main.java.messages.MyPriorityMailbox"
  //Other mailbox configuration goes here
}
akka{

    actor{
      guardian-supervisor-strategy = "main.java.engine.SupervisorStrategyGuardian"
    }
}

Это класс, который определяет supervisorstrategy

public class SupervisorStrategyGuardian implements SupervisorStrategyConfigurator {


@Override
public SupervisorStrategy create() {
    return new AllForOneStrategy(//
            10, //
            Duration.create("10 seconds"), //
            DeciderBuilder //
                    .matchAny(ex -> SupervisorStrategy.stop())
                    .build());    }
}

Это Актер, который генерирует всех других актеров, которые могут потерпеть неудачу. Как вы можете видеть, генерирует ли один из его дочерних акторов исключение AskTimeoutException, которое он выполняет Escalade (), чтобы достичь актера-хранителя.

  @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());
}
...