2013-02-25 13 views
12

In Play 1 to po prostu:Jak zaplanować godzinę pracy za pomocą Play 2.1?

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

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

Co jest odpowiednikiem dla Play 2.1?

wiem, że Play używa Akka i found this code sample:

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

Ale bycie noob Scala Nie rozumiem, jak działa. Czy ktoś może dostarczyć kompletny, działający przykład (koniec do końca)?

Odpowiedz

22

Oto wyciąg z 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") 
    } 

} 

Po prostu uruchamia demona na początku aplikacji, a następnie co 5 minut. Używa Play 2.1 i działa zgodnie z oczekiwaniami.

Należy zauważyć, że ten kod używa Global object, który pozwala uruchomić pewien kod przy starcie aplikacji.

+0

Interesujące. Jednak nadal moja metoda onStart() nie jest wywoływana przy użyciu powyższego kodu ... – ripper234

+1

Ponieważ musisz używać obiektu globalnego, jak wspomniano w mojej odpowiedzi. 'Global.scala' musi być przechowywany w folderze twojej aplikacji (bez żadnego pakietu) –

+1

Konwencja nad konfiguracją :(W końcu działa! Wielkie dzięki – ripper234

4

Przykład:

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

Jakie są '0.seconds' i' 30.minutes'? Te nie kompilują się dla mnie. – ripper234

+0

Otrzymuję 'oczekiwaną definicję klasy lub obiektu ', gdy gra kompiluje pierwszy wiersz kodu po klasie (niezależnie od tego, co jest). Każdy pomysł, dlaczego? – ripper234

+1

Użyj tego importu dla części 'seconds':' import scala.concurrent.duration._' – EECOLOR

3

Spójrz w Akka's doc

próbki dałeś jest:

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

oznacza: rozpocząć 0 sekund od teraz, co 30 minut, wysłać do aktor testActor wiadomość Tick

co więcej do prostych zadań, które prawdopodobnie don; t trzeba użyć Actors - można po prostu zaplanować nowa Runnable:

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

More detailed description in other answer

+0

Czy możesz spojrzeć na moją korespondencję z EECOLOR? To jest ostatni kod, który osiągnąłem i kompiluje, ale nic nie robi. https://gist.github.com/ripper234/5032857 – ripper234

+1

Może coś mi umknęło, ale zwykle zadania planowania są przekazywane do obiektu globalnego (jak tylko @nico_ekito pokazane: P) – biesior

-1

Prosty harmonogram gry bez użycia aktorów.

Można to zrobić za pomocą org.quartz.scheduler i wywołanie harmonogramu z klasy Global.

Sample scheduler

+0

Może to teoretycznie odpowiedzieć na pytanie , ale najlepiej będzie podać istotne części odpowiedzi tutaj dla przyszłych użytkowników i podać link do odniesienia. [Odpowiedzi zdominowane przez link] (// meta.stackexchange.com/questions/8231) mogą stać się nieważne przez [ link rot] (// en.wikipedia.org/wiki/Link_rot). – Mogsdad

+0

Dzięki, uniknę tego w przyszłości. – binshi

Powiązane problemy