3

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 分後に実行される new を作成しています。Logger.info("Running the thing!")正常に実行されます...「Running the thing!」を見ることができます。サーバーを起動してから 1 分後にアプリケーション ログに記録されます。ただし、controllers.Application.runTheThing呼び出されないようです:

object Application extends Controller {
  def runTheThing = DBAction {
    implicit session => {
      Logger.info("It's happening!")
      DBThing.doSomeDBStuff()
    }
  }
  // ...
}

私の「それは起こっている!」ログステートメントは決して表示されず、DBThing.doSomeDBStuff()実行されるはずのことは決して起こりません。興味深いのは、コンソールまたはログ ファイルにエラーがないことです。

スケジュールされたランナブルからコントローラーDBActionを呼び出すにはどうすればよいですか? または、これが機能するようにスケジューラをどのように作り直す必要がありますか? どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1