【问题标题】:Calling Controller DBAction with scheduled Akka Runnable (in Scala / Play 2.2)使用预定的 Akka Runnable 调用 Controller DBAction(在 Scala / Play 2.2 中)
【发布时间】:2013-10-31 03:53:32
【问题描述】:

我正在尝试在我的 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?或者我应该如何重新设计我的调度程序以使其正常工作?任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 只有日志消息有效吗?如果可以,能否成功检索到会话对象的Object ID?
  • @sdanzig,不,"It's happening!" 日志不起作用,所以我也无法从会话中记录任何内容。但是,"running the thing!" 日志确实 显示...所以日程安排正常,但我没有以正确的方式调用控制器。

标签: scala playframework akka playframework-2.2 play-slick


【解决方案1】:

调用 action 方法只会返回一个 Action 实例,要真正执行它,您必须像 play 通常对请求所做的那样调用它。我建议将其提取到非控制器代码中,然后从您的计划任务中调用它。

【讨论】:

  • 所有逻辑已经在非控制器代码中,因此重构应该是微不足道的。问题是非控制器代码需要一个(implicit s: Session),这是它所做的数据库所必需的,所以我不知道如何处理它。无论如何,等我回家后我会试一试,然后回来报告。
  • 这行得通,谢谢。我必须将lazy val session = database.createSession() 添加到Global.onStart,然后传递会话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2016-11-04
  • 2014-03-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
相关资源
最近更新 更多