2015-07-28 11 views
7

Próbując zaplanować zadania tak w grze Framework 2.4.2 Scala bez powodzenia:Jak prawidłowo zaplanować zadanie w scali Play Framework 2.4.2?

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

Nic nie jest drukowane w konsoli. Co robię źle?

+0

Podobne rozwiązanie http://stackoverflow.com/a/29360985/243233 – Jus12

Odpowiedz

19

Ok. Oto kod scheduler pracy mam wbudowany: Moduł:

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

Harmonogram:

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

Aktor:

@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") 
    } 
} 

Trzeba także dodać moduł w application.conf:

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

Mam nadzieję, że to pomoże komuś

+0

mimo że wstrzyknąłem moją aplikację do programu planującego, nadal generuje wyjątek w środowisku wykonawczym, informując, że moja aplikacja nie została uruchomiona. (no i przy okazji, czym jest aktualizator?) –

+0

Dzięki. To działało dla mnie jak urok. –

+0

Kiedy mówisz "dodaj moduł do pliku application.conf", jak dokładnie to robisz? Czy możesz dodać to do odpowiedzi? – Jonik

0

Spróbuj

context.system.scheduler.schedule 

A także upewnić się, że zalogowaniu na Debug poziomie inaczej te wiadomości nie będzie go do konsoli. Jeśli nie masz pewności, spróbuj tymczasowo zmienić je na Logger.error.

+0

Próbowałem, bez powodzenia. Może potrzebuję czegoś dodać, aby zarejestrować tego aktora do uruchomienia podczas startu? – user2975535