2015-01-21 19 views
0

我試圖檢測應用程序停止事件(在Websphere 8.0中)以調用servlet的靜態方法。我想知道是否有一種直截了當的方式來確定應用程序是否已被命令停止。當Servlet的doGet()仍在運行時檢測到J2EE容器停止事件

這是情景:

  1. 我有一個servlet中,WorkerServlet,運行循環這樣 while(!forceStop){...}在它的doGet()。當應用程序爲 時,此循環連續運行。
  2. 當容器停止 應用程序(因爲任何事件,如重新發布,停止,重新啓動 應用程序/服務器)我想調用靜態方法WorkerServlet.forceStop(){forceStop = true;}

這樣,WorkerServlet的循環就完成了,servlet可以被容器立即銷燬。目前的行爲是容器在強制破壞之前等待60秒,這在開發期間是不可接受的。

我曾嘗試不同的方法,但他們沒有工作

  1. 一個ServletContextListener.contextDestroyed()。直到所有servlet被銷燬纔會調用
  2. A Spring ApplicationListener檢測應用程序上下文何時將被銷燬。在所有servlet被銷燬之前不會被調用。
  3. 另一個帶有destroy()方法的servlet調用WorkerServlet.forceStop()。容器不會銷燬()這個servlet,因爲有另一個運行請求。

那麼,有沒有其他方法來檢測容器的應用程序關閉事件,以便我可以調用該靜態方法?

+0

是否'contextDestroyed()'方法獲取調用後才所有servlet被破壞化妝到你的應用程序流有什麼區別? – kaysush 2015-01-21 09:36:55

+0

是的......我嘗試使用''ServletContextListener.contextDestroyed()''來調用''WorkerServlet.forceDestroy()''。但是,因爲在所有的servlet被銷燬之前它不會被調用,所以它是沒用的... – codependent 2015-01-21 09:53:37

+0

你能詳細說明你想用這個無限循環來實現什麼嗎? – kaysush 2015-01-21 09:54:28

回答

0

我發現的唯一解決方法是使用啓動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(); 
    } 
} 
相關問題