2013-10-31 19 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',然後傳遞會話。 –