Вызов контроллера DBAction с запланированным Akka Runnable (в Scala / Play 2.2)

Я пытаюсь запланировать работу Akka при запуске приложения Play 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
      }
    })
  }
}

Как видите, я создаю новый 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()
    }
  }
  // ...
}

Моя "Это происходит!" оператор журнала никогда не появляется, и материал, который DBThing.doSomeDBStuff() должен делать никогда не бывает. Любопытно, что в консоли и файлах журналов нет ошибок.

Как можно вызвать контроллер DBAction из запланированного запуска? Или как мне переделать свой планировщик, чтобы это работало? Любая помощь будет принята с благодарностью, спасибо.

1 ответ

Решение

Вызов метода action ничего не даст, кроме как вернет экземпляр Action, для его фактического выполнения вам придется вызывать его, как обычно делает play с запросом. Я бы порекомендовал извлечь это из неконтроллерного кода и вместо этого вызвать его из запланированной задачи.

Другие вопросы по тегам