关闭 Apache CXFServlet

Shutting down Apache CXFServlet

我正在执行一个提供多种服务方法的 CXF Servlet。

web.xml:

...
<servlet>
    <description>Apache CXF Endpoint</description>
    <display-name>cxf</display-name>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>
        org.apache.cxf.transport.servlet.CXFServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
...

如何以编程方式正确关闭这样的 运行 服务器实例?

public class ServiceImpl {
...
    @GET
    @Path("/shutdown/")
    void shutdown() {
       // ...releasing any resources...
       // ...terminating any threads...
       // TODO terminating running server
       ...
    }
...

取决于您的 servlet 规范。您可以选择 class 声明 ...

  1. 创建您自己的 class 实现 http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html 接口并使用 @WebListener 声明它 -> 然后,实现 2 个方法:contextDestroyed() 和 contextInitialized()...

  2. 在没有 @WebListener 注释声明的情况下执行相同的操作,而是将先前创建的 class 声明到您的 web.xml 文件(使用完全限定的 class姓名).

据我了解,一旦 "shut it down",您希望 CXF servlet 停止处理 Web 服务请求。不幸的是,所有 servlet 都由 Web 容器管理(例如 Tomcat),因此您无法手动完成。

您需要自定义解决方案。我看到两个选项:

  • 扩展 CXFServlet 并覆盖其 service 方法
  • 编写 (servlet) 过滤器

两者都可以检查一些全局变量(在最简单的情况下)并在服务关闭时立即 return HTTP 错误。变量应设置为 ServiceImpl#shutdown.


编辑:

在 Tomcat 上您也可以使用 Manager App to stop existing application。您可以从您的服务或直接调用服务。

这显然会停止整个应用程序及其所有 servlet。我没有测试过,但我很确定正在进行的请求不会终止,而是在应用程序停止之前优雅地完成(至少这是它在某些应用程序服务器(如 WebSphere Application Server)上的工作方式)。

如果您需要更细粒度的方法来停止和更新应用程序的某些部分,您可以考虑使用 OSGi。但这是另一个问题的主题。