play framework 2.1 - 调度异步任务

ope*_*sas 13 scheduled-tasks akka playframework-2.0 playframework-2.1

在play的2.0.x doc中,您可以看到如何安排异步任务:

http://www.playframework.org/documentation/2.0.4/ScalaAkka

Akka.system.scheduler.schedule(0 seconds, 30 minutes, testActor, "tick")
Run Code Online (Sandbox Code Playgroud)

你怎么能用最近的重新播放Play 2.1来实现同样的目的?

整个akka API似乎已经改变了......

我检查过:

https://github.com/playframework/Play20/wiki/Highlights https://github.com/playframework/Play20/wiki/Migration以及 http://doc.akka.io/docs/akka/2.1.0- RC1 /项目/迁移指南-2.0.x版本,2.1.x.html

也在这里问:https://groups.google.com/d/topic/play-framework/7VcwNea6QlM/discussion

bie*_*ior 20

使用示例代码Akka API我做了快速测试,适合我.

比较2.0.4和2.1RC1之间的代码我可以看到调度程序只有两个变化:

  1. 取代进口

    // import akka.util.duration._
    import scala.concurrent.duration._
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加进口:

    import play.api.libs.concurrent.Execution.Implicits._
    
    Run Code Online (Sandbox Code Playgroud)

app/controllers/Application.scala

package controllers

import play.api._
import play.api.mvc._
import play.libs.Akka

import akka.actor._
import scala.concurrent.duration._
import play.api.libs.concurrent.Execution.Implicits._

object Application extends Controller {

  def index = Action {

    // say hello
    Logger.info("hello, index action started")

    val Tick = "tick"
    val Tack = "tack"

    val tickActor = Akka.system.actorOf(Props(new Actor {
      def receive = {
        case Tick => Logger.info("that still ticks!")
        case Tack => Logger.warn("... 7 seconds after start, only once")
      }
    }))

    // Repeat every 5 seconds, start 5 seconds after start
    Akka.system.scheduler.schedule(
      5 seconds,
      5 seconds,
      tickActor,
      Tick
    )

    // do only once, 7 seconds after start
    Akka.system.scheduler.scheduleOnce(7 seconds, tickActor, Tack)

    Ok(views.html.index("Your new application is ready."))
  }

}
Run Code Online (Sandbox Code Playgroud)

编辑

Nota bene,正如我从Julien的小组帖子中看到的那样,这足以defaultContext仅导入:

import play.api.libs.concurrent.Execution.Implicits.defaultContext
Run Code Online (Sandbox Code Playgroud)


rip*_*234 9

biesior的答案很棒

但是,你不要去通过一个演员,如果你不想.以下是使用旧的相同的答案java.lang.Runnable:

Akka.system.scheduler.schedule(5 minutes, 5 minutes, new Runnable {
  def run() {
    Logger.info("that still ticks!")
  }
})
Akka.system.scheduler.scheduleOnce(7 minutes, new Runnable {
  def run() {
    Logger.warn("... 7 seconds after start, only once")
  }
})
Run Code Online (Sandbox Code Playgroud)