【问题标题】:How to shutdown a servlet container from within a servlet?如何从 servlet 中关闭 servlet 容器?
【发布时间】:2009-09-24 14:12:46
【问题描述】:

是否有一种可移植的方法来请求 Servlet 容器优雅地从 servlet 中关闭?

我所说的可移植性是指一种适用于所有符合标准的容器(Tomcat、Jetty、Winstone 等)的技术。

请注意,这与 Servlet.destroy() 方法相反,该方法在容器关闭 servlet 时被调用。

【问题讨论】:

  • 没有可移植的方式,因为这是个坏主意。
  • 嗯.. 那么我怎样才能以便携的方式优雅地关闭容器(用于升级、维护)?
  • @HRJ:说得好听一点,你不知道。您使用容器的特定关闭顺序。
  • 哎呀,我从来没有说过为什么:你不知道是因为你的应用程序无法判断其他应用程序是否在 servlet 容器中运行。
  • @Bemrose 我理解你的观点。但是,我感兴趣的是“机制”而不是“政策”。

标签: java servlets containers


【解决方案1】:

据我所知,Java EE Servlet Spec 中没有定义任何方法,它需要具有可移植性。

将它链接到 servlet API 规范,所以如果有这样的方法,它会在某处记录。

我也同意一个 servlet 能够关闭容器是一个非常糟糕的主意!

【讨论】:

    【解决方案2】:

    System.exit();

    如果您在没有 SecurityManager 的情况下运行。

    编辑:这是优雅的吗?这取决于容器。

    在 Tomcat 上,如果你用 0 调用它

      System.exit(0);
    

    它与shutdown.sh 或Catalina.stop() 一样优雅,因为shutdown 挂钩只是调用stop()。

    【讨论】:

    • 进一步思考,在没有其他解决方案的情况下,这似乎是一个好方法。容器可以向虚拟机注册关闭钩子以确保优雅。
    • 虽然不能保证服务器已经注册了任何关闭钩子。这取决于服务器的实现方式。它还存在并发问题,因为与关闭请求同时发出的请求在处于不一致状态时可能会被终止。
    • 坏主意。尤其是在云端。但我不会因为这个答案责怪 ZZ Coder。当然,提到了 SecurityManager;我只是希望任何将此建议作为真实答案的人都知道他们在做什么。
    • 如果内存不足怎么办?这是在没有复杂的监控软件的情况下摆脱它的最简单方法。我们有一个守护进程会立即启动它。
    • 你没有提到守护进程,我认为你没有在共享环境中运行你的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2012-05-02
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多