播放应用程序关闭时不会调用停止挂钩

时间:2016-08-23 13:33:39

标签: scala playframework dependency-injection lifecycle shutdown-hook

我正在使用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项目中有相同的配置,它只是有效。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

这是Play 2.5.5的错误,请参阅this issue。你可能最好坚持2.5.4直到2.5.6被释放。