【问题标题】:Play Framework application never stops when calling DefaultApplicationLifecycle.stopPlay Framework 应用程序在调用 Default Application Lifecycle.stop 时永远不会停止
【发布时间】:2016-11-28 15:07:50
【问题描述】:

我正在开发一个基于 Akka/Play 的集群应用程序,其中前端节点可以被集群隔离。在这种情况下,我想退出 Play 应用程序,以便它可以重新启动并重新加入集群。

我在很多地方读到,优雅地停止播放应用程序的正确方法是使用ApplicationLifecycle。我正在使用依赖注入来获取DefaultApplicationLifecycle 对象并在ThisActorSystemQuarantinedEvent 发生时调用defaultApplicationLifecycle.stop()

我的问题是应用程序最终处于一种奇怪的状态,应用程序仍在运行并在 HTTP 端口上侦听,但几乎没有任何工作(所有参与者似乎都死了)。似乎Future 从未完成,而我在我的应用程序中没有定义stopHook。我是否应该在某个时候强制致电System.exit()

【问题讨论】:

  • 看起来DefaultApplicationLifecycle#stop 所做的只是运行所有的停止钩子。您需要自己处理实际过程。如果未来永远不会完成,可能是因为某个停止钩子由于某种原因未能完成(不是因为没有添加任何内容),但很难说是哪个或为什么。

标签: scala playframework akka


【解决方案1】:

ApplicationLifecycle 用于注册在应用程序停止时执行的挂钩。但是,它不应该用于停止应用程序。来自docs

这用于挂钩 Play 生命周期事件,特别是在 Play 停止时。

...

停止钩子在应用程序关闭时执行,与注册时相反。由于这种反向排序,只要组件没有收到关闭事件,它就可以知道使用它所依赖的组件是安全的。

您真正想要的是Application 实例。来自Application.stop docs

停止应用程序。当所有停止钩子运行后,返回的未来将被赎回。

Application.stop 被调用时,所有在ApplicationLifecycle 中注册的钩子都以“注册时的反向”方式执行。您也可以使用依赖注入获得Application 实例:

class SomeClass @Inject() (app: Application) {
    def somethingHappensThatRequireApplicationToStop() = app.stop()
}

您仍然可以接收请求,因为您刚刚停止了应用程序,但不是Server。不完全确定,但我认为您可以按照上面注入应用程序的方式注入它:

import play.core.server.Server

class SomeClass @Inject() (app: Application, server: Server) {
    def somethingHappensThatRequireApplicationToStop() = {
        app.stop()
        server.stop()
    }   
}

此外,由于它停止服务器会强制应用停止,因此您只需要以下内容:

import play.core.server.Server

class SomeClass @Inject() (server: Server) {
    def somethingHappensThatRequireToStop() = {
        server.stop()
    }   
}

【讨论】:

  • 谢谢!我只是想知道为什么我的 defaultApplication 生命周期的未来从未被称为:S。我会尝试你的建议,谢谢!
  • 实际上我看到了完全相同的行为:应用程序处于陈旧状态。我想知道如何调试应用程序永远不会真正停止的事实。
  • 我想念你问题的一个细节。查看我关于如何停止服务器的编辑。
  • 服务器好像不能这样注入,我试试看怎么访问。
  • 关于注入和测试,@marcospereira,你能看看我遇到的类似问题吗:stackoverflow.com/questions/40924057/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
相关资源
最近更新 更多