2016-06-30 17 views
6

Mamy Play-Project, który używa PlayFramework 2.5.4 i MongoDB. Chcemy codziennie aktualizować naszą bazę danych. W tej chwili sprawdzamy czas za każdym razem, gdy otrzymamy Żądanie i aktualizację, jeśli minął dzień. To prowadzi do pewnych problemów:Planowanie zadań asynchronicznych w PlayFramework 2.5.X (Java)

  1. Obecny gracz musi czekać w spokojnej długo, dopóki żądanie kończy
  2. może się zdarzyć, że nie jest jeden dzień bez aktualizacji (ale chcemy codzienne jeden, nawet jeśli nic zmiany)
  3. musimy zmodyfikować każde żądanie, które wstawiamy.

Tak więc znalazłem już dokumentację AKKA i stare zapytania stackoverflow (takie jak How to schedule task daily + onStart() in Play 2.0.4?). Ale rozwiązania już nie działają.

Akka.system().scheduler() 

jest przestarzała

system.scheduler() 

daje compilingerrors (from docu) i nie wiem, czy import brakuje lub co innego. Wiem, że powinieneś używać @inject od wersji 2.4, ale nie mogę znaleźć właściwych przykładów, jak używać go z harmonogramem lub jak z niego korzystać po

Właściwie wszystko, co chcę zrobić, to wywołanie PlayerDBHandler.newDay() co dzień w tym samym czasie.

podziękowania za pomoc

Odpowiedz

14

nie widząc błędy kompilacji, zgaduję że system nie jest zdefiniowana. Rozszerzając przykład z dokumentacji, coś takiego powinno działać.

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 wstrzykuje, a można również wstrzykiwać odwołanie do aktora. Ewentualnie możesz wyszukać aktora ref od system.

Po dostosowaniu tego, aby zrobić to, co chcesz, zadeklaruj SchedulingTask w module.

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

Wreszcie, zaktualizuj swoje conf aplikacji, aby włączyć moduł.

play.modules.enabled += "com.example.MyModule" 
Powiązane problemy