我正在尝试在我的 Play 2.2 应用程序启动时安排 Akka 作业。
在最简单的形式中,这就是我的代码的样子:
import play.api.Application
import play.api.Play.current
import play.api.GlobalSettings
import play.api.Logger
import play.api.db.DB
import scala.concurrent.duration._
import play.api.libs.concurrent.Akka
import play.api.libs.concurrent.Execution.Implicits._
import scala.slick.driver.MySQLDriver.simple._
object Global extends GlobalSettings {
override def onStart(app: Application) {
lazy val database = Database.forDataSource(DB.getDataSource())
scheduleTheThing(app)
}
private def scheduleTheThing(app: Application) {
Akka.system.scheduler.scheduleOnce(1.minute, new Runnable {
override def run() {
Logger.info("running the thing!")
controllers.Application.runTheThing
}
})
}
}
如您所见,我正在创建一个新Runnable
的,将在应用程序启动后 1 分钟执行。Logger.info("Running the thing!")
执行得很好......我可以看到“正在运行的东西!” 在启动服务器 1 分钟后的应用程序日志中。但是,controllers.Application.runTheThing
似乎没有被调用:
object Application extends Controller {
def runTheThing = DBAction {
implicit session => {
Logger.info("It's happening!")
DBThing.doSomeDBStuff()
}
}
// ...
}
我的“它正在发生!” log 语句永远不会出现,DBThing.doSomeDBStuff()
应该做的事情永远不会发生。奇怪的是控制台或日志文件中没有错误。
应该如何从计划的可运行对象中调用控制器 DBAction?或者我应该如何重新设计我的调度程序以使其正常工作?任何帮助将不胜感激,谢谢。