13

在 Play 1 中,它很简单:

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

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

Play 2.1 的等价物是什么?

我知道 Play 使用 akka,我发现了这个代码示例

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

但作为一个 Scala 菜鸟,我不明白它是如何工作的。有人可以提供一个完整的工作示例(端到端)吗?

4

4 回答 4

22

这是我的代码的摘录:

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

}

它只是在应用程序启动时启动一个守护程序,然后每 5 分钟启动一次。它使用 Play 2.1 并且按预期工作。

请注意,此代码使用Global 对象,该对象允许在应用程序启动时运行一些代码。

于 2013-02-25T20:50:44.660 回答
4

一个例子:

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)
于 2013-02-25T18:45:03.407 回答
3

看看Akka 的文档

你给的样本是:

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

意思是:从现在开始 0 秒,每 30 分钟发送给参与者testActor消息 Tick

对于您可能不需要的简单任务,更重要的是不需要使用 Actors - 您可以安排新的 Runnable:

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

其他答案中的更详细描述

于 2013-02-25T18:51:43.520 回答
-1

一个不使用 Actors 的简单播放调度程序。

它可以使用 org.quartz.scheduler 并从 Global 类调用调度程序来完成。

示例调度程序

于 2016-03-10T00:36:10.640 回答