我正在使用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"
我在应用程序启动时看到启动消息,但在关闭时我看不到停止消息。我注意到即使我的应用程序没有运行,清理实际上仍在后台继续。我想我可能会泄漏一些东西。
我在Heartbeat
类的https://github.com/mehmetakiftutuncu/quupNotificationsServer的另一个Play 2.5.4项目中有相同的配置,它只是有效。我在这里做错了什么?