2016-06-30 11 views
6

Wir haben ein Play-Projekt, das PlayFramework 2.5.4 und MongoDB verwendet. Wir möchten unsere Datenbank täglich aktualisieren. Im Moment überprüfen wir die Uhrzeit jedes Mal, wenn wir eine Anfrage erhalten und aktualisieren, ob ein Tag zu Ende ist. Das zu einigen Problemen führt:Planen von asynchronen Aufgaben in PlayFramework 2.5.X (Java)

  1. Der aktuelle Spieler eine ruhige lange Zeit warten muss, bis die Anforderung
  2. beendet kann es passieren, dass es eines Tages (kein Update, sondern wir jeden Tag einen wollen, auch wenn nichts Änderungen)
  3. wir müssen jede Anfrage ändern, die wir einfügen.

So fand ich bereits in der Dokumentation von AKKA und alte stackoverflowquestions (wie How to schedule task daily + onStart() in Play 2.0.4?). Aber die Lösungen funktionieren nicht mehr.

Akka.system().scheduler() 

ist veraltet

system.scheduler() 

compilingerrors gibt (from docu) und ich weiß nicht, ob ein Import fehlt oder was sonst noch. Wie ich weiß, dass Sie seit Version verwenden @inject sollte 2.4, aber ich kann nicht die richtige Beispiele, wie man es verwenden, mit Zeitplan finden oder wie es zu benutzen afterall

wollen alles, was ich eigentlich ist PlayerDBHandler.newDay tun() aufrufen, jede Tag zur gleichen Zeit.

Vielen Dank für Hilfe

Antwort

14

Ohne die Kompilierungsfehlern zu sehen, vermute ich, dass system nicht definiert ist. Erweitern Sie das Beispiel aus der Dokumentation, sollte so etwas funktionieren.

public class SchedulingTask { 

    @Inject 
    public SchedulingTask(final ActorSystem system, 
          @Named("update-db-actor") ActorRef updateDbActor) { 
     system.scheduler().schedule(
      Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 
      Duration.create(1, TimeUnit.DAYS),  //Frequency 
      updateDbActor, 
      "update", 
      system.dispatcher(), 
      null); 
    } 
} 

system eingespritzt wird, und Sie können auch einen Verweis auf die Schauspieler injizieren. Alternativ können Sie den Schauspielerref von system nachschlagen.

Sobald Sie dies angepasst haben, um das zu tun, was Sie wollen, deklarieren Sie SchedulingTask in einem Modul.

package com.example; 
import com.google.inject.AbstractModule; 
import play.libs.akka.AkkaGuiceSupport; 

public class MyModule extends AbstractModule implements AkkaGuiceSupport { 
    @Override 
    protected void configure() { 
     bindActor(UpdateDbActor.class, "update-db-actor"); 
     bind(SchedulingTask.class).asEagerSingleton(); 
    } 
} 

Schließlich aktualisieren Sie Ihre Anwendung conf, um das Modul zu aktivieren.

play.modules.enabled += "com.example.MyModule" 
Verwandte Themen