2012-04-16 2 views
5

J'ai un acteur Akka qui valide des données aléatoires et y apporte des modifications en fonction de l'heure d'affichage de ces données et les met à jour. À l'heure actuelle ce que je fais est en utilisant ce code à l'intérieur d'un contrôleur:Play Framework 2.0 planifie un acteur Akka au lancement du serveur

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

Le problème avec l'utilisation ceci à l'intérieur d'un contrôleur est que quelqu'un doit accéder à une page traitée par ce contrôleur pour l'acteur pour commencer, et si cela ça n'arrive pas, tout reste en pause.

Existe-t-il un moyen de le faire au démarrage du serveur? Je ne sais pas comment il se comporte si l'acteur génère une exception. Arrête-t-il les horaires futurs ou continue-t-il? Dans le cas contraire, y a-t-il un moyen de replacer l'acteur en cas de panne ou d'erreur?

Répondre

13

Pour exécuter votre code au démarrage du serveur, jetez un oeil à la Global object: déplacer le code de votre contrôleur à la méthode 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 cela aide beaucoup –

1

Framework Play fournit un moyen par lequel la planification d'un emploi peut être fait dans le Global.java sans que vous l'invoquiez explicitement.

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

Et créer l'acteur, HelloActor.java Dans la méthode sur onReceive, vous pouvez faire le traitement des données, l'envoi de courriels, etc.

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

Hope this helps.

Questions connexes