Как правильно запланировать задачу в Play Framework 2.4.2 scala?

Попытка запланировать такие задачи в Play Framework 2.4.2 Scala безуспешно:

import akka.actor.Actor
import play.api.libs.concurrent.Akka
import scala.concurrent.duration._
import play.api.Play.current
import scala.concurrent.ExecutionContext.Implicits.global

class Scheduler extends Actor {

  override def preStart() {
    val dbupdate = Akka.system.scheduler.schedule(
      0.microseconds, 5.minutes, self, "update")
    val pictureClean = Akka.system.scheduler.schedule(
      0.microseconds, 30.minutes, self, "clean")
  }

  def receive = {
    case "update" => updateDB()
    case "clean" => clean()
  }

  def updateDB(): Unit ={
    Logger.debug("updates running")
  }

  def clean(): Unit ={
    Logger.debug("cleanup running")
  }
}

В консоли ничего не печатается. Что я делаю неправильно?


person sergeda    schedule 28.07.2015    source источник
comment
Связанное решение stackoverflow.com/a/29360985/243233   -  person Jus12    schedule 15.01.2016


Ответы (2)


Ok. Вот рабочий код планировщика, который я построил: Модуль:

class JobModule extends AbstractModule with AkkaGuiceSupport {
  def configure() = {
    bindActor[SchedulerActor]("scheduler-actor")
    bind(classOf[Scheduler]).asEagerSingleton()
  }
}

Планировщик:

class Scheduler @Inject() (val system: ActorSystem, @Named("scheduler-actor") val schedulerActor: ActorRef)(implicit ec: ExecutionContext)
{
  system.scheduler.schedule(
    0.microseconds, 5.minutes, schedulerActor, "update")
  system.scheduler.schedule(
    30.minutes, 30.days, schedulerActor, "clean")
}

Актер:

@Singleton
class SchedulerActor @Inject() (updater: Updater) extends Actor {
  def receive = {
    case "update" => updateDB()
    case "clean" => clean()
  }

  def updateDB(): Unit ={
    Logger.debug("updates running")
  }

  def clean(): Unit ={
    Logger.debug("cleanup running")
  }
}

Вам также необходимо добавить свой модуль в application.conf:

play.modules.enabled += "modules.JobModule"

Надеюсь, это поможет кому-то

person sergeda    schedule 30.07.2015
comment
даже несмотря на то, что я внедрил свое приложение в планировщик, он все равно выдает исключение во время выполнения, говорящее, что мое приложение не запущено. (и кстати, что такое апдейтер?) - person Roy Lin; 07.08.2015
comment
Когда вы говорите добавить свой модуль в application.conf, как именно вы это делаете? Можете ли вы добавить это к ответу? - person Jonik; 07.01.2016
comment
В классе Scheduler, поскольку вы уже вводите ActorSytem, вам не нужно будет вводить Application, а затем вам не понадобится и implicit app. После этого просто измените Akka.system.scheduler.schedule(...), чтобы использовать внедренную систему: system.scheduler.schedule(...). - person marcospereira; 15.01.2016
comment
Спасибо, этот ответ был очень полезным! Если кто-то столкнется с проблемой «Нет проблем с запущенным приложением» с этой настройкой (особенно с короткой или нулевой начальной задержкой для задачи), убедитесь, что вы заменили использование Play.configuration на внедренное conf: Configuration и DB.withConnection на внедренное db: Database, а также другие вещи, упомянутые в < href="https://www.playframework.com/documentation/2.4.x/Migration24#Dependency-Injected-Components" rel="nofollow noreferrer">руководство по миграции 2.4. - person Jonik; 15.01.2016
comment
@RoyLin: я думаю, что средство обновления - это собственный код ответчика, который будет использоваться из запланированного задания. Просто удалите его или замените чем-то, что вам нужно внедрить (обычно сервис, UserService или что-то еще). - person Jonik; 15.01.2016
comment
что такое апдейтер: апдейтер? это импорт play scala? - person AlexCon; 21.03.2017

Пытаться

context.system.scheduler.schedule

А также убедитесь, что у вас есть ведение журнала на уровне Debug, иначе эти сообщения не попадут в консоль. Если вы не уверены, попробуйте временно изменить их на Logger.error.

person mattinbits    schedule 28.07.2015
comment
Пробовал, не повезло. Может быть, мне нужно что-то добавить, чтобы зарегистрировать этого актера для запуска при загрузке? - person sergeda; 29.07.2015