2015-07-28 23 views
7

Cercando di pianificare le operazioni di simile in Play quadro 2.4.2 Scala senza fortuna:Come pianificare correttamente l'attività in Play Framework 2.4.2 scala?

import akka.actor.Actor 
import play.api.libs.concurrent.Akka 
import scala.concurrent.duration._ 
import play.api.Play.current 
import scala.concurrent.ExecutionContext.Implicits.global 

class Scheduler extends Actor { 

    override def preStart() { 
    val dbupdate = Akka.system.scheduler.schedule(
     0.microseconds, 5.minutes, self, "update") 
    val pictureClean = Akka.system.scheduler.schedule(
     0.microseconds, 30.minutes, self, "clean") 
    } 

    def receive = { 
    case "update" => updateDB() 
    case "clean" => clean() 
    } 

    def updateDB(): Unit ={ 
    Logger.debug("updates running") 
    } 

    def clean(): Unit ={ 
    Logger.debug("cleanup running") 
    } 
} 

Nulla è stampata in console. Cosa sto facendo di sbagliato?

+0

Soluzione correlata http://stackoverflow.com/a/29360985/243233 – Jus12

risposta

19

Ok. Ecco il codice di scheduler di lavoro che ho costruito: Modulo:

class JobModule extends AbstractModule with AkkaGuiceSupport { 
    def configure() = { 
    bindActor[SchedulerActor]("scheduler-actor") 
    bind(classOf[Scheduler]).asEagerSingleton() 
    } 
} 

Scheduler:

class Scheduler @Inject() (val system: ActorSystem, @Named("scheduler-actor") val schedulerActor: ActorRef)(implicit ec: ExecutionContext) 
{ 
    system.scheduler.schedule(
    0.microseconds, 5.minutes, schedulerActor, "update") 
    system.scheduler.schedule(
    30.minutes, 30.days, schedulerActor, "clean") 
} 

Attore:

@Singleton 
class SchedulerActor @Inject() (updater: Updater) extends Actor { 
    def receive = { 
    case "update" => updateDB() 
    case "clean" => clean() 
    } 

    def updateDB(): Unit ={ 
    Logger.debug("updates running") 
    } 

    def clean(): Unit ={ 
    Logger.debug("cleanup running") 
    } 
} 

È inoltre necessario aggiungere il modulo in application.conf:

play.modules.enabled += "modules.JobModule" 

Spero che questo possa aiutare qualcuno

+0

anche se ho iniettato la mia applicazione nello scheduler, genera comunque un'eccezione durante il runtime che dice che la mia applicazione non è stata avviata. (oh, a proposito, che cos'è l'aggiornamento?) –

+0

Grazie. Ha funzionato come un fascino per me. –

+0

Quando dici "aggiungi il tuo modulo a application.conf", come lo fai esattamente? Puoi aggiungerlo alla risposta? – Jonik

0

Prova

context.system.scheduler.schedule 

Ed anche fare in modo che avete l'accesso a livello di Debug altrimenti quei messaggi non ce la farà alla console. Se non sei sicuro, prova a cambiarli temporaneamente in Logger.error.

+0

Provato, senza fortuna. Potrebbe essere necessario aggiungere qualcosa per registrare questo attore per l'avvio? – user2975535