2016-06-30 30 views
6

Abbiamo un progetto di gioco che utilizza PlayFramework 2.5.4 e MongoDB. Vogliamo aggiornare il nostro database ogni giorno. Al momento controlliamo l'ora ogni volta che riceviamo una Richiesta e aggiorniamo se un giorno è finito. che porta ad alcuni problemi:Pianificazione delle attività asincrone in PlayFramework 2.5.X (Java)

  1. Il giocatore di turno deve aspettare una tranquilla lungo periodo di tempo fino a quando la richiesta termina
  2. può succedere che c'è un giorno alcun aggiornamento (ma vogliamo uno di tutti i giorni, anche se nulla modifiche)
  3. dobbiamo modificare ogni richiesta che inseriamo.

Quindi ho trovato già la documentazione di AKKA e vecchi stackoverflowquestions (come How to schedule task daily + onStart() in Play 2.0.4?). Ma le soluzioni non funzionano più.

Akka.system().scheduler() 

è deprecato

system.scheduler() 

dà compilingerrors (from docu) e non so se l'importazione è mancante o che altro. Come so dovresti usare @inject dalla versione 2.4, ma non trovo esempi corretti su come usarlo con programma o come usarlo dopotutto

In realtà tutto ciò che voglio fare è chiamare PlayerDBHandler.newDay() ogni giorno alla stessa ora.

Grazie per l'aiuto

risposta

14

senza vedere gli errori di compilazione, sto cercando di indovinare che system non è definito. Espandendo l'esempio dalla documentazione, qualcosa del genere dovrebbe funzionare.

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 viene iniettata, e si può anche iniettare un riferimento all'attore. In alternativa, è possibile cercare l'attore ref da system.

Una volta adattato per fare ciò che si desidera, dichiarare SchedulingTask in un modulo.

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

Infine, aggiornare l'applicazione conf per abilitare il modulo.

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