Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用控制器DBAction,并使Akka可运行(在Scala/Play 2.2中)_Scala_Playframework_Akka_Playframework 2.2_Play Slick - Fatal编程技术网

调用控制器DBAction,并使Akka可运行(在Scala/Play 2.2中)

调用控制器DBAction,并使Akka可运行(在Scala/Play 2.2中),scala,playframework,akka,playframework-2.2,play-slick,Scala,Playframework,Akka,Playframework 2.2,Play Slick,我正试图在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.Ak

我正试图在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(“运行这个东西!”)
执行得很好。。。启动服务器1分钟后,我可以在应用程序日志中看到“正在运行”。但是,
controllers.Application.runTheThing
似乎没有被调用:

object Application extends Controller {
  def runTheThing = DBAction {
    implicit session => {
      Logger.info("It's happening!")
      DBThing.doSomeDBStuff()
    }
  }
  // ...
}
我的“它正在发生!”日志语句从未出现过,而
DBThing.doSomeDBStuff()
应该做的事情从未出现过。奇怪的是,控制台或日志文件中没有错误


如何从计划的runnable调用控制器DBAction?或者我应该如何修改我的调度程序以使其正常工作?非常感谢您的帮助。

调用action方法只会返回一个action实例,要真正执行它,您必须像调用请求一样调用它。我建议将此代码提取到非控制器代码,并从计划任务中调用该代码。

仅日志消息有效吗?如果是这样,您能否成功检索会话对象的对象ID?@sdanzig,否
“正在发生!”
日志不起作用,因此我也无法从会话中记录任何内容。然而,
“运行该东西!”
日志确实会出现。。。因此,时间表运行良好,但我没有以正确的方式调用控制器。所有逻辑都已经在非控制器代码中,因此重构应该是微不足道的。问题是,非控制器代码需要一个
(隐式s:Session)
,这是它所做的DB工作所必需的,所以我不确定如何处理它。不管怎样,我回家后会试试看,然后回来汇报。这很有效,谢谢。我必须将
lazy val session=database.createSession()
添加到
Global.onStart
,然后传递会话。