Вопрос по akka, playframework-2.0 – Play Framework 2.0 планирует запуск Akka Actor при запуске сервера

5

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

<code>static ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class));
static {
    Akka.system().scheduler().schedule(
        Duration.Zero(),
        Duration.create(5, TimeUnit.MINUTES),
        instance, "VALIDATE"
    );
}
</code>

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

Есть ли способ сделать это при запуске сервера? Я на самом деле не знаю, как он себя ведет, если актер генерирует исключение. Это останавливает будущие графики или это продолжается? В случае, если это не так, есть ли способ перегруппировать актера в случае сбоя или ошибки?

Ваш Ответ

2   ответа
13

Для запуска вашего кода при запуске сервера, посмотрите наГлобальный объект: переместите код с вашего контроллера наonStart() метод:

public class Global extends GlobalSettings {

  @Override
  public void onStart(Application app) {
    ActorRef instance = Akka.system().actorOf(new Props(ValidateAndChangeIt.class));
    Akka.system().scheduler().schedule(
        Duration.Zero(),
        Duration.create(5, TimeUnit.MINUTES),
        instance, "VALIDATE"
    );
  }  

}
это очень помогает Hugo Alves
1

Play Framework предоставляет способ, которым планирование работы может быть выполнено вGlobal.java без вашего явного вызова.

public class Global extends GlobalSettings {

    private Cancellable scheduler;

    @Override
    public void onStart(Application app) {
        super.onStart(app);
        schedule();
    }

    @Override
    public void onStop(Application app) {
    //Stop the scheduler
        if (scheduler != null) {
            scheduler.cancel();
            this.scheduler = null;
        }
    }
    private void schedule() {
        try {
            ActorRef helloActor = Akka.system().actorOf(new Props(HelloActor.class));
            scheduler = Akka.system().scheduler().schedule(
                    Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds
                    Duration.create(30, TimeUnit.MINUTES),     //Frequency 30 minutes
                    helloActor,
                    "tick",
                    Akka.system().dispatcher(), null);
        }catch (IllegalStateException e){
            Logger.error("Error caused by reloading application", e);
        }catch (Exception e) {
            Logger.error("", e);
        }
    }
}

И создать актера,HelloActor.java В наonReceive метод, вы можете сделать обработку данных, отправку писем и т. д.

public class HelloActor extends UntypedActor {

    @Override
    public void onReceive(Object message) throws Exception {
        // Do the processing here. Or better call another class that does the processing.
        // This method will be called when ever the job runs.
        if (message.equals("tick")) {
            //Do something
            // controllers.Application.sendEmails();
        } else {
            unhandled(message);
        }
    }
}

Надеюсь это поможет.

Похожие вопросы