Stop Hook не вызывается, когда приложение Play закрывается

Я разрабатываю приложение, используя Play Framework 2.5.5, и у меня возникают проблемы с добавлением стоп-хука в мой класс. У меня есть класс под названием Broom как следование, чтобы запланировать уборку.

@ImplementedBy(classOf[Broom])
trait AbstractBroom

@Singleton
class Broom @Inject()(ActorSystem: ActorSystem,
                      ApplicationLifecycle: ApplicationLifecycle,
                      Conf: AbstractConf) extends AbstractBroom with Logging {
  private val enabled: Boolean             = Conf.getBoolean("enabled", defaultValue = true)
  private val initialDelay: FiniteDuration = Conf.getFiniteDuration("initialDelay", FiniteDuration(10, TimeUnit.SECONDS))
  private val interval: FiniteDuration     = Conf.getFiniteDuration("interval",     FiniteDuration(1, TimeUnit.DAYS))

  private val actor: ActorRef = ActorSystem.actorOf(Props(new BroomActor(Conf)), BroomActor.actorName)

  private val cancellable: Option[Cancellable] = {
    if (enabled) {
      val firstRun: LocalDateTime = LocalDateTime.now.plusSeconds(interval.toSeconds).withNano(0)

      Log.warn(s"Starting Broom scheduled to $firstRun...")

      val c: Cancellable = ActorSystem.scheduler.schedule(
        initialDelay,
        interval,
        actor,
        Wipe
      )

      Option(c)
    } else {
      None
    }
  }

  ApplicationLifecycle.addStopHook {
    () =>
      actor ! PoisonPill
      cancellable.foreach {
        c: Cancellable =>
          Log.warn("Shutting down Broom...")
          c.cancel()
      }
      ActorSystem.terminate()
  }
}

Просто регулярно отправляет Wipe сообщение для BroomActor поэтому он может выполнить некоторую очистку старых данных. Как я хочу остановиться Broom когда приложение закрывается, я добавил зависимость ApplicationLifecycle и называется addStopHook метод.

Для начала Broom когда приложение запускается, у меня есть класс с именем Modules в com.example пакет как следующий

class Modules extends AbstractModule {
  override def configure(): Unit = {
    bind(classOf[Broom]).asEagerSingleton()
  }
}

который упоминается в моей конфигурации следующим образом.

play.modules.enabled += "com.example.Modules"

Когда приложение запускается, я вижу сообщение о запуске, но при завершении работы не вижу сообщения об остановке. Я заметил, что очистка на самом деле продолжается в фоновом режиме, хотя мое приложение не работает. Я предполагаю, что я мог что-то вытекать.

У меня была почти такая же конфигурация в другом моем проекте Play 2.5.4 здесь https://github.com/mehmetakiftutuncu/quupNotificationsServer для Heartbeat класс, и это просто работает. Что я делаю не так для этого здесь?

1 ответ

Решение

Это ошибка в Play 2.5.5, смотрите эту проблему. Вы, вероятно, лучше придерживаетесь 2.5.4, пока 2.5.6 не выпущен.

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