Базовый пользовательский Akka Supervisor на Java - PullRequest
5 голосов
/ 15 августа 2011

Я пытаюсь реализовать задания с семантикой повторных попыток, используя Akka . Если рабочий не работает (выдает исключение) во время своей работы, в дополнение к его перезапуску я хочу повторно отправить работу, над которой он работал.

Подход, который я пробую, - это собственный супервизор, но я не могу заставить его перезапустить работника при сбое. например Запустите следующий код с Akka 1.1.3, и вы никогда не увидите сообщения о перезапуске:

  import akka.actor.ActorRef;
  import akka.actor.UntypedActor;
  import akka.actor.UntypedActorFactory;
  import akka.config.Supervision;

  import static akka.actor.Actors.actorOf;
  import static java.lang.System.out;

  public class Supervisor extends UntypedActor {
      private ActorRef worker;

      public static class Worker extends UntypedActor {
          @Override
          public void onReceive(Object message) {
              throw new RuntimeException("croak");
          }

          public void preRestart(Object reason) {
              out.println("supervisor is restarting me!");
          }

          public void postRestart(Object reason) {
              out.println("supervisor restarted me.");
          }
      }

      public static void main(String[] args) {
          ActorRef supervisor = actorOf(new UntypedActorFactory() {
              public UntypedActor create() {
                  return new Supervisor();
              }
          });

          supervisor.start();
          supervisor.sendOneWay("job");
      }

      @Override
      public void preStart() {
          getContext().setFaultHandler(new Supervision.OneForOneStrategy(
              new Class[]{RuntimeException.class},
              3,
              1000
          ));

          // why doesn't the compiler like this line?
          // worker = actorOf(Worker.class);

          worker = actorOf(new UntypedActorFactory() {
              public UntypedActor create() {
                  return new Worker();
              }
          });

          getContext().startLink(worker);
      }

      @Override
      public void onReceive(Object message) {
          worker.sendOneWay(message);
      }
  }

Есть идеи, что я делаю не так?

Спасибо!

1 Ответ

6 голосов
/ 16 августа 2011

Это правильные сигнатуры для методов перезапуска в Worker actor:

    @Override
    public void preRestart(Throwable reason) {
        out.println("supervisor is restarting me!");
    }

    @Override
    public void postRestart(Throwable reason) {
        out.println("supervisor restarted me.");
    }

И я не получаю никакой ошибки компиляции для закомментированной строки.

...