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

时间:2015-01-21 09:09:37

标签: java java-ee servlets listener containers

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

这是情景:

  1. 我有一个servlet,WorkerServlet,运行这样的循环 在其doGet()中while(!forceStop){...}。虽然申请是 up,这个循环不断运行。
  2. 当容器停止时 应用程序(因为任何事件,如重新发布,停止,重新启动 应用程序/服务器)我想调用静态方法WorkerServlet.forceStop(){forceStop = true;}
  3. 这样,WorkerServlet的循环就会完成,并且容器可以立即销毁servlet。当前的行为是容器在强制销毁之前等待60秒,这在开发期间是不可接受的。

    我尝试了不同的方法,但没有一种方法可以使用

    1. ServletContextListener.contextDestroyed()。在所有servlet都被销毁之前不会被调用
    2. Spring ApplicationListener ,用于检测何时销毁de应用程序上下文。在所有servlet都被销毁之前不会被调用。
    3. 另一个带有destroy()方法的servlet ,它调用WorkerServlet.forceStop()。容器没有销毁()这个servlet,因为还有另一个运行请求。
    4. 那么,有没有其他方法可以检测容器的app shutdown事件,以便我可以调用该静态方法?

1 个答案:

答案 0 :(得分:1)

我发现的唯一解决方法是使用启动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();
    }
}