关闭Apache CXFServlet

时间:2015-12-27 18:44:55

标签: java cxf shutdown

我正在执行一个提供多种服务方法的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
       ...
    }
...

2 个答案:

答案 0 :(得分:1)

取决于您的servlet规范。你可以选择课堂宣言......

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

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

答案 1 :(得分:1)

据我所知,一旦“关闭”,你想让CXF servlet停止处理Web服务请求。不幸的是,所有servlet都是由web容器管理的(例如Tomcat),所以你不能手动完成。

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

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

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

编辑:

在Tomcat上,您还可以使用Manager App to stop existing application。您可以直接从服务中调用服务。

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

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