2013-02-25 11 views
12

In Play 1 era semplicemente:Come pianificare un lavoro orario con Play Framework 2.1?

@Every(value = "1h") 
public class WebsiteStatusReporter extends Job { 

    @Override 
    public void doJob() throws Exception { 
     // do something 
    } 
} 

Qual è l'equivalente for Gioca 2.1?

So che il gioco utilizza Akka e ho found this code sample:

import play.api.libs.concurrent.Execution.Implicits._ 
Akka.system.scheduler.schedule(0.seconds, 30.minutes, testActor, "tick") 

Ma essendo un noob Scala Non capisco come funziona. Qualcuno può fornire un esempio completo e funzionante (end to end)?

risposta

22

Ecco un estratto da un code of mine:

import scala.concurrent.duration.DurationInt 
import akka.actor.Props.apply 
import play.api.Application 
import play.api.GlobalSettings 
import play.api.Logger 
import play.api.Play 
import play.api.libs.concurrent.Execution.Implicits.defaultContext 
import play.api.libs.concurrent.Akka 
import akka.actor.Props 
import actor.ReminderActor 

object Global extends GlobalSettings { 

    override def onStart(app: Application) { 

    val controllerPath = controllers.routes.Ping.ping.url 
    play.api.Play.mode(app) match { 
     case play.api.Mode.Test => // do not schedule anything for Test 
     case _ => reminderDaemon(app) 
    } 

    } 

    def reminderDaemon(app: Application) = { 
    Logger.info("Scheduling the reminder daemon") 
    val reminderActor = Akka.system(app).actorOf(Props(new ReminderActor())) 
    Akka.system(app).scheduler.schedule(0 seconds, 5 minutes, reminderActor, "reminderDaemon") 
    } 

} 

Avvia semplicemente un demone all'inizio dell'applicazione e quindi ogni 5 minuti. Usa Play 2.1 e funziona come previsto.

Si noti che questo codice utilizza Global object che consente di eseguire codice all'avvio dell'applicazione.

+0

Interessante. Tuttavia, il mio metodo onStart() non viene chiamato utilizzando il codice precedente ... – ripper234

+1

Perché è necessario utilizzare l'oggetto Global come indicato nella risposta. Il 'Global.scala' deve essere archiviato nella cartella dell'app (senza alcun pacchetto) –

+1

Convenzione sulla configurazione :(Funziona finalmente! Grazie mille – ripper234

4

Un esempio:

case object Tick 

class TestActor extends Actor { 

    def receive = { 
    case Tick => //... 
    } 
} 

val testActor = Akka.system.actorOf(Props[TestActor], name = "testActor") 

Akka.system.scheduler.schedule(0.seconds, 30.minutes, testActor, Tick) 
+0

Quali sono '' 0.seconds' e 30.minutes'? Questi non si compilano per me. – ripper234

+0

Ricevo la "definizione di oggetto o classe prevista" quando riproduce la prima riga di codice dopo la classe (indipendentemente da cosa sia). Qualche idea del perché? – ripper234

+1

Utilizzare questa importazione per la parte 'seconds':' import scala.concurrent.duration._' – EECOLOR

3

Date un'occhiata in Akka's doc

campione ti ha dato è:

def schedule(
    initialDelay: Duration, 
    frequency: Duration, 
    receiver: ActorRef, 
    message: Any): Cancellable 

Mezzi: Iniziamo 0 secondi da ora, a ogni 30 minuti inviare al attore testActor messaggio Tick

per di più per compiti semplici che probabilmente don; t bisogno di usare attori - si può semplicemente pianificare il nuovo Runnable:

def schedule(
    initialDelay: Duration, frequency: Duration, runnable: Runnable): Cancellable 

More detailed description in other answer

+0

Puoi guardare la mia corrispondenza con EECOLOR? Questo è l'ultimo codice che ho raggiunto e compila, ma non fa nulla. https://gist.github.com/ripper234/5032857 – ripper234

+1

Forse mi sono perso qualcosa, ma in genere le attività di pianificazione vanno all'oggetto Globale (come appena mostrato @nico_ekito: P) – biesior

-1

Un semplice programmatore di riproduzione senza l'utilizzo di attori.

È possibile utilizzare org.quartz.scheduler e chiamare lo scheduler dalla classe Global.

Sample scheduler

+0

Questo può teoricamente rispondere alla domanda , ma sarebbe meglio includere le parti essenziali della risposta qui per gli utenti futuri e fornire il link per riferimento. [Le risposte dominate dai link] (// meta.stackexchange.com/questions/8231) possono diventare non valide attraverso [ link rot] (// en.wikipedia.org/wiki/Link_rot). – Mogsdad

+0

Grazie. Lo eviterò in futuro. – binshi

Problemi correlati