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 не выпущен.