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



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

这是场景:

  1. 我有一个servlet,WorkerServlet,运行这样的循环 while(!forceStop){...}在其 doGet() 中。当应用程序是向上,此循环持续运行。
  2. 当容器停止应用程序(由于任何事件,例如重新发布、停止、重新启动应用程序/服务器)我想调用静态方法WorkerServlet.forceStop(){forceStop = true;}.

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

我尝试了不同的方法,但没有一种有效

  1. A ServletContextListener.contextDestroy().在销毁所有 servlet 之前不调用
  2. 一个 Spring ApplicationListener,用于检测 de 应用程序上下文何时将被销毁。在销毁所有 servlet 之前不调用。
  3. 另一个带有 destroy() 方法的 servlet,用于调用 WorkerServlet.forceStop() 。容器不会破坏()这个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();
    }
}

最新更新