如何在Play Framework 2.4.2 scala中正确安排任务?

如何在Play Framework 2.4.2 scala中正确安排任务?,scala,scheduled-tasks,guice,playframework-2.4,Scala,Scheduled Tasks,Guice,Playframework 2.4,尝试在Play Framework 2.4.2 Scala中安排这样的任务时运气不佳: import akka.actor.Actor import play.api.libs.concurrent.Akka import scala.concurrent.duration._ import play.api.Play.current import scala.concurrent.ExecutionContext.Implicits.global class Scheduler extend

尝试在Play Framework 2.4.2 Scala中安排这样的任务时运气不佳:

import akka.actor.Actor
import play.api.libs.concurrent.Akka
import scala.concurrent.duration._
import play.api.Play.current
import scala.concurrent.ExecutionContext.Implicits.global

class Scheduler extends Actor {

  override def preStart() {
    val dbupdate = Akka.system.scheduler.schedule(
      0.microseconds, 5.minutes, self, "update")
    val pictureClean = Akka.system.scheduler.schedule(
      0.microseconds, 30.minutes, self, "clean")
  }

  def receive = {
    case "update" => updateDB()
    case "clean" => clean()
  }

  def updateDB(): Unit ={
    Logger.debug("updates running")
  }

  def clean(): Unit ={
    Logger.debug("cleanup running")
  }
}
控制台中未打印任何内容。我做错了什么?

试试看

context.system.scheduler.schedule

还要确保您在
Debug
级别进行了日志记录,否则这些消息将无法发送到控制台。如果您不确定,请尝试将其更改为
记录器。暂时出错。

确定。下面是我构建的调度器的工作代码: 模块:

调度程序:

class Scheduler @Inject() (val system: ActorSystem, @Named("scheduler-actor") val schedulerActor: ActorRef)(implicit ec: ExecutionContext)
{
  system.scheduler.schedule(
    0.microseconds, 5.minutes, schedulerActor, "update")
  system.scheduler.schedule(
    30.minutes, 30.days, schedulerActor, "clean")
}
演员:

@Singleton
class SchedulerActor @Inject() (updater: Updater) extends Actor {
  def receive = {
    case "update" => updateDB()
    case "clean" => clean()
  }

  def updateDB(): Unit ={
    Logger.debug("updates running")
  }

  def clean(): Unit ={
    Logger.debug("cleanup running")
  }
}
您还需要在
application.conf
中添加模块:

play.modules.enabled += "modules.JobModule"

希望这能帮助那些尝试过的人,运气不好。可能我需要添加一些东西来注册此参与者以在启动时运行?即使我已将我的应用程序注入调度程序,它仍会在运行时抛出一个异常,表示我的应用程序尚未启动。(哦,顺便问一下,什么是updater?)当你说“将你的模块添加到application.conf”时,你是如何做到的?你能把它添加到答案中吗?在
调度程序
类中,由于你已经在注入
ActorSystem
,你不需要注入
应用程序
,也不需要
隐式应用程序
。之后,只需更改
Akka.system.scheduler.schedule(…)
以使用注入的系统:
system.scheduler.schedule(…)
。谢谢,这个答案非常有用!如果任何人在此设置中遇到“没有启动的应用程序”问题(特别是任务的初始延迟很短或没有),请确保已将
Play.configuration
的使用替换为injected
conf:configuration
DB.withConnection
的使用替换为injected
DB:Database
,以及中提到的其他内容。@RoyLin:我认为“更新程序”是应答者自己的代码,可以从计划任务中使用。只需将其删除或替换为您需要注入的内容(通常是服务、用户服务或您需要的任何内容)。相关解决方案
play.modules.enabled += "modules.JobModule"