使用play 2.5在scala中创建计划任务

tzo*_*zik 1 scala playframework

我想在Play 2.5中创建一个计划任务.我找到了一些与此主题相关的资源,但没有一个是针对Play 2.5的.我发现这个资源与我正在寻找的相关,看起来很不错.同样在同一链接上有一个从2.4到2.5的迁移指南.

旧版本中的示例用作GlobalSettings基础,但在2.5中已弃用.迁移指南很重要,因为它说我们应该使用依赖注入而不是扩展这个特性.我不知道该怎么做.

你能给我一些指导吗?

mgo*_*osk 8

你需要在Akka Actor中运行sheduled任务:

SchedulerActor.scala

package scheduler

import javax.inject.{Inject, Singleton}

import akka.actor.Actor
import org.joda.time.DateTime
import play.api.Logger

import scala.concurrent.ExecutionContext

@Singleton
class SchedulerActor @Inject()()(implicit ec: ExecutionContext) extends Actor {
  override def receive: Receive = {
    case _ =>
      // your job here
  }
}
Run Code Online (Sandbox Code Playgroud)

Scheduler.scala

package scheduler

import javax.inject.{Inject, Named}

import akka.actor.{ActorRef, ActorSystem}
import play.api.{Configuration, Logger}

import scala.concurrent.ExecutionContext
import scala.concurrent.duration._

class Scheduler @Inject() (val system: ActorSystem, @Named("scheduler-actor") val schedulerActor: ActorRef, configuration: Configuration)(implicit ec: ExecutionContext) {
  val frequency = configuration.getInt("frequency").get
  var actor = system.scheduler.schedule(
    0.microseconds, frequency.seconds, schedulerActor, "update")

}
Run Code Online (Sandbox Code Playgroud)

JobModule.scala

package modules

import com.google.inject.AbstractModule
import play.api.libs.concurrent.AkkaGuiceSupport
import scheduler.{Scheduler, SchedulerActor}

class JobModule extends AbstractModule with AkkaGuiceSupport {
  def configure() = {
    bindActor[SchedulerActor]("scheduler-actor")
    bind(classOf[Scheduler]).asEagerSingleton()
  }
}
Run Code Online (Sandbox Code Playgroud)

application.conf

play.modules.enabled += "modules.JobModule"
Run Code Online (Sandbox Code Playgroud)