Akka: Пользовательские стратегии контроля akka не зарегистрированы с использованием Java

Я собираюсь исследовать Akka жизненный цикл и Akka стратегии надзора за актерами. Я создаю свои собственные исключения и переопределяю public SupervisorStrategy supervisorStrategy() метод изучения жизненного цикла акки и стратегии их восстановления. Ниже приведен мой код:

public class JavaActor extends AbstractActor {

@Override
public PartialFunction<Object, BoxedUnit> receive() {
    System.out.println("----   In the receive method "+Thread.currentThread().getName());
    return ReceiveBuilder.
            matchEquals("Ping" , s -> {
                System.out.println("$$$ Ping Match Successfully");
                throw new EsclateException("Might be esclate");
            }).
            matchAny(x -> {
                System.out.println("### Matched value is :  "+ x);
                sender().tell(new Status.Failure(new Exception("unknown message")), self());
            }).build();
}

@Override
public void preRestart(Throwable reason, Option<Object> message) throws Exception {
    super.preRestart(reason, message);
    System.out.println(">>> Actor preRestart method calls : "+Thread.currentThread().getName());
}

@Override
public void postRestart(Throwable reason) throws Exception {
    super.postRestart(reason);
    System.out.println(">>> Actor postRestart method calls : "+Thread.currentThread().getName());
}

@Override
public void preStart() throws Exception {
    super.preStart();
    System.out.println(">>> Actor preStart method calls "+Thread.currentThread().getName());
}

@Override
public void postStop() throws Exception {
    super.postStop();
    System.out.println(">>> Actor postStop method calls "+Thread.currentThread().getName());
}

@Override
public SupervisorStrategy supervisorStrategy() {
    System.out.println("**** SupervisorStrategy Override Successfully ****");
    return new OneForOneStrategy(5, Duration.create(1, TimeUnit.MINUTES),
            DeciderBuilder.match(ResumeException.class, e -> SupervisorStrategy.resume())
            .match(RestartException.class, e -> SupervisorStrategy.restart())
            .match(StopException.class, e -> SupervisorStrategy.stop())
            .match(EsclateException.class, e -> SupervisorStrategy.escalate())
            .matchAny(e -> SupervisorStrategy.escalate()).build());

}}

в receive() метод, когда я бросаю EsclateException логи продолжаются и не завершают актера. Но когда я заменяю код исключения на throw new Error(), актеры прекращают работу и прекращают. Что касается вывода, кажется, что мой SupervisorStrategyне зарегистрированы и актеры бегут по умолчанию SupervisorStrategy, Как я могу зарегистрировать свои стратегии?

Ниже мой код вызова:

public class JavaActorTest {

public static ActorSystem system;

@BeforeClass
public static void start() {
    system = ActorSystem.create("ActorLifeCycleTest");
}

@AfterClass
public static void cleanup() {
    JavaTestKit.shutdownActorSystem(system);
    system = null;
}

@Test
public void testActorCreation(){
    TestActorRef<JavaActor> actorRef = TestActorRef.create(system, Props.create(JavaActor.class));
    actorRef.tell("Ping", ActorRef.noSender());
    assertThat(true, is(true));
}}

1 ответ

Решение

Актер контролируется его родителем, а не сам по себе, поэтому supervisorStrategy его родительского актера - то, что будет применено, когда актер терпит неудачу.

В ваш образец вы не включаете своих родителей, поэтому применяется контроль со стороны актера-опекуна.

Вы можете прочитать больше о надзоре в документации здесь: http://doc.akka.io/docs/akka/2.4/general/supervision.html

Другие вопросы по тегам