关闭 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 声明 ...
创建您自己的 class 实现 http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html 接口并使用 @WebListener 声明它
-> 然后,实现 2 个方法:contextDestroyed() 和 contextInitialized()...
在没有 @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。但这是另一个问题的主题。
我正在执行一个提供多种服务方法的 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 声明 ...
创建您自己的 class 实现 http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContextListener.html 接口并使用 @WebListener 声明它 -> 然后,实现 2 个方法:contextDestroyed() 和 contextInitialized()...
在没有 @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。但这是另一个问题的主题。