2012-04-16 2 views
5

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

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

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

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

ответ

13

Для запуска кода при запуске сервера, посмотрите на Global object: переместить код из контроллера в 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" 
    ); 
    } 

} 
+0

Это помогает –

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); 
     } 
    } 
} 

Надеется, что это помогает.

Смежные вопросы