繁体   English   中英

关闭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规范。 你有班级宣言的选择......

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

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

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

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

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

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


编辑:

在Tomcat上,您还可以使用Manager App来停止现有应用程序 您可以直接从服务中调用服务。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM