2013-10-31 20 views
3

我试图安排一个Akka作业,当我的Play 2.2应用程序启动。调度控制器DBAction与预定Akka Runnable(在斯卡拉/播放2.2)

在它最简单的形式,这是我的代码如下所示:

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 
     } 
    }) 
    } 
} 

正如你所看到的,我创建将在应用程序启动后执行1分钟新RunnableLogger.info("Running the thing!")被执行得很好......我能够看到“运行的东西!”在启动服务器1分钟后的应用程序日志中。然而,controllers.Application.runTheThing似乎并没有得到所谓:

​​

我“这是怎么回事!”日志语句永远不会显示,并且DBThing.doSomeDBStuff()应该做的事情永远不会发生。奇怪的是,控制台或日志文件中没有错误。

如何从预定的runnable调用控制器DBAction?或者我应该如何重新调整我的调度程序,使其工作?任何帮助将不胜感激,谢谢。

+0

只是日志消息的工作?如果是这样,您能否成功检索会话对象的对象ID? – sdanzig

+0

@sdanzig,不会发生''发生了!''日志不起作用,所以我无法记录会话中的任何内容。 ''运行的东西!“'日志,但是,*显示...所以计划工作正常,但我没有以正确的方式调用控制器。 –

回答

3

调用动作方法除了返回一个Action实例之外什么都不会做,实际执行它就必须像调用通常一样请求调用它。我建议将其解压缩到非控制器代码,然后调用您的计划任务。

+0

所有的逻辑已经在非控制器代码中,所以重构应该是微不足道的。问题是非控制器代码需要一个'(implicit s:Session)',这是数据库所需的东西,所以我不确定如何处理它。无论如何,当我稍后回到家时,我会给这个镜头一个镜头,然后回报。 –

+1

这工作,谢谢。我不得不将'lazy val session = database.createSession()'添加到'Global.onStart',然后传递会话。 –