2012-04-16 5 views
5

Mam aktora Akka, który sprawdza poprawność losowych danych i wprowadza na nie pewne zmiany w oparciu o czas wyświetlania danych i aktualizuje go. Obecnie to, co robię jest przy użyciu tego kodu wewnątrz kontrolera:Gra Framework 2.0 planuje aktora Akka przy uruchomieniu serwera

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

Problem z użyciem tego środka kontrolera jest to, że ktoś ma dostęp do strony przetwarzane przez tego kontrolera dla aktora, aby rozpocząć, a jeśli to tak się nie dzieje, wszystko pozostaje w bezruchu.

Czy można to zrobić na początku serwera? Właściwie to nie wiem, jak się zachowuje, jeśli aktor generuje wyjątek. Czy zatrzymuje harmonogramy na przyszłość, czy kontynuuje? Jeśli tak nie jest, czy istnieje jakiś sposób na zmianę harmonogramu aktora w przypadku awarii lub błędu?

Odpowiedz

13

Do uruchomienia kodu przy starcie serwera, spójrz na Global object: przenieść kod z kontrolera do sposobu 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

ty to bardzo pomaga –

1

play ramowa zapewnia drogę, którą harmonogram pracy może być zrobione w Global.java bez twojego wyraźnego wywoływania.

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

i stworzyć aktor, HelloActor.java W dniu onReceive metodzie można zrobić przetwarzania danych, wysyłania e-maili itp

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

nadzieję, że to pomaga.