在 servlet 的 doGet() 仍然 运行 时检测 J2EE 容器停止事件
Detect J2EE container stop event while a servlet's doGet() is still running
我正在尝试检测应用程序停止事件(在 Websphere 8.0 中)以调用 servlet 的静态方法。我想知道是否有一种直接的方法来查明应用程序是否已被命令停止。
场景是这样的:
- 我有一个servlet,
WorkerServlet
,运行一个像这样的循环
while(!forceStop){...}
在其 doGet() 中。虽然应用程序是
up,这个循环不断运行。
- 当容器停止
应用程序(因为任何事件,例如重新发布、停止、重新启动
application/server) 我想调用静态方法
WorkerServlet.forceStop(){forceStop = true;}
。
这样,WorkerServlet 的循环就会结束,servlet 可以立即被容器销毁。当前行为是容器在强制销毁之前等待 60 秒,这在开发期间是不可接受的。
我尝试了不同的方法,但 none 有效
- A ServletContextListener.contextDestroyed()。在销毁所有 servlet 之前不调用
- A Spring ApplicationListener 用于检测何时销毁应用程序上下文。在销毁所有 servlet 之前不调用。
- 另一个带有调用
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();
}
}
我正在尝试检测应用程序停止事件(在 Websphere 8.0 中)以调用 servlet 的静态方法。我想知道是否有一种直接的方法来查明应用程序是否已被命令停止。
场景是这样的:
- 我有一个servlet,
WorkerServlet
,运行一个像这样的循环while(!forceStop){...}
在其 doGet() 中。虽然应用程序是 up,这个循环不断运行。 - 当容器停止
应用程序(因为任何事件,例如重新发布、停止、重新启动
application/server) 我想调用静态方法
WorkerServlet.forceStop(){forceStop = true;}
。
这样,WorkerServlet 的循环就会结束,servlet 可以立即被容器销毁。当前行为是容器在强制销毁之前等待 60 秒,这在开发期间是不可接受的。
我尝试了不同的方法,但 none 有效
- A ServletContextListener.contextDestroyed()。在销毁所有 servlet 之前不调用
- A Spring ApplicationListener 用于检测何时销毁应用程序上下文。在销毁所有 servlet 之前不调用。
- 另一个带有调用
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();
}
}