2012-04-16 15 views
5

Possiedo un attore Akka che convalida dati casuali e apporta alcune modifiche ad esso in base allo show time di tali dati e lo aggiorna. Attualmente quello che sto facendo è di utilizzare questo codice all'interno di un controllore:Play Framework 2.0 pianifica un Akka Actor all'avvio dal server

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

Il problema con l'utilizzo di questo all'interno di un controllore è che qualcuno deve accedere a una pagina trattati da tale controller per l'attore per iniziare, e se questo non succede, tutto rimane in pausa.

C'è un modo per farlo all'avvio del server? In realtà non so come si comporta se l'attore genera un'eccezione. Arresta gli impegni futuri o continua? In caso contrario, c'è un modo per far riprogrammare l'attore in caso di crash o errore?

risposta

13

Per l'esecuzione il codice in fase di avvio del server, date un'occhiata al Global object: spostare il codice dal controller al metodo 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

questo aiuta molto –

1

quadro gioco fornisce un modo con cui la pianificazione di un posto di lavoro può essere fatto nel Global.java senza che lo si invochi esplicitamente.

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

E creare l'attore, HelloActor.java Nel sulla onReceive metodo, è possibile eseguire l'elaborazione dei dati, l'invio di messaggi di posta elettronica, ecc

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

Spero che questo aiuti.