在 servlet 的 doGet() 仍然 运行 时检测 J2EE 容器停止事件

Detect J2EE container stop event while a servlet's doGet() is still running

我正在尝试检测应用程序停止事件(在 Websphere 8.0 中)以调用 servlet 的静态方法。我想知道是否有一种直接的方法来查明应用程序是否已被命令停止。

场景是这样的:

  1. 我有一个servlet,WorkerServlet,运行一个像这样的循环 while(!forceStop){...} 在其 doGet() 中。虽然应用程序是 up,这个循环不断运行。
  2. 当容器停止 应用程序(因为任何事件,例如重新发布、停止、重新启动 application/server) 我想调用静态方法WorkerServlet.forceStop(){forceStop = true;}

这样,WorkerServlet 的循环就会结束,servlet 可以立即被容器销毁。当前行为是容器在强制销毁之前等待 60 秒,这在开发期间是不可接受的。

我尝试了不同的方法,但 none 有效

  1. A ServletContextListener.contextDestroyed()。在销毁所有 servlet 之前不调用
  2. A Spring ApplicationListener 用于检测何时销毁应用程序上下文。在销毁所有 servlet 之前不调用。
  3. 另一个带有调用 WorkerServlet.forceStop() 的 destroy() 方法 的 servlet。容器不会 destroy() 这个 servlet,因为还有另一个 运行 请求。

那么,有没有其他方法可以检测容器的应用程序关闭事件,以便我可以调用该静态方法?

我发现的唯一解决方法是使用启动 bean。幸好 Webshpere 的 EJB 容器在 servlet 容器之前停止了:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Singleton;
import javax.ejb.Startup;

@Singleton
@Startup
public class WorkerServletStopper {

    @PreDestroy
    public void preDestroy(){
        WorkerServlet.forceStop();
    }
}