在Play中启动Akka actors

6

我有一个Play应用程序,其中包含一些需要定期运行的任务。我可以使用Akka调度这些任务,但是我不确定如何启动调度程序本身。目前我的做法是创建一个Scheduler对象,并从Global.scala中启动它,就像这样:

// app/jobs/Scheduler.scala
package jobs

import akka.util.duration._
import play.api.libs.concurrent.Akka
import play.api.Play.current

object Scheduler {
  def start() {
    Akka.system.scheduler.schedule(0 seconds, 1 minutes) {
      SomeTask.start()
    }
  }
}

然后

// app/Global.scala
import play.api._
import jobs.Scheduler

object Global extends GlobalSettings {
  override def onStart(app: Application) {
    Scheduler.start()
  }
}

问题是,在这种情况下,即使在开发模式和测试期间,任务也会运行,这很快就变得非常烦人。
有没有办法只在生产模式下使用Akka调度作业?

1
Play 对象上有 isProdisDevisTest 方法,用于确定当前运行的模式。请参考 Play 文档。 - 4e6
谢谢。虽然您提到的方法依赖于在范围内有一个隐式的app,但实际上并非如此,因为onStart的参数不是隐式的。根据您提供的链接,我发现可以简单地检查app.mode,这样做与您提到的方法相同。如果您想将其放入答案中,我很乐意接受它。 - Andrea
1个回答

7

对象 Play 上的方法 isProdisDevisTest 可以很有帮助。即使您没有隐式的 Application,也可以显式地传递它。

override def onStart(app: Application) {
  if (isProd(app)) Scheduler.start()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接