簡體   English   中英

如何使用Play Framework 2.1安排每小時的工作?

[英]How to schedule an hourly job with Play Framework 2.1?

在播放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新手,我不了解其工作原理。 有人可以提供完整的可行示例(端到端)嗎?

這是代碼的摘錄:

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對象 ,該對象允許在應用程序啟動時運行一些代碼。

一個例子:

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)

看看Akka的文檔

您提供的示例是:

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

意思是:從現在開始0秒,每30分鍾發送給actor testActor消息Tick

對於您可能不需要的簡單任務,還有什么要用;您只需安排新的Runnable:

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

其他答案中的更詳細說明

一個簡單的播放調度程序,無需使用Actor。

可以使用org.quartz.scheduler並從Global類調用調度程序來完成。

樣品排程器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM