2013-10-06 162 views
0

如何讓servlet在被銷燬之前等待當前任務完成?servlet應該等待任務完成

更新...

@WebListener 
public class EmailServlet implements ServletContextListener { 
private ScheduledExecutorService executorService; 
ScheduledFuture scheduledFuture; 
private int delay = 300000; 
private int repeat = 300000; 

@Override 
public void contextInitialized(ServletContextEvent event) { 
    System.out.println("The email servlet started"); 
    executorService = Executors.newSingleThreadScheduledExecutor(); 
    scheduledFuture = executorService.scheduleWithFixedDelay(new Task3(), delay, repeat, TimeUnit.MILLISECONDS); 

} 

@Override 
public void contextDestroyed(ServletContextEvent event) { 

    scheduledFuture.cancel(true); 
    executorService.shutdown(); 
    System.out.println("The email servlet stopped"); 
} 
} 

回答

0

可以使用未來isDone方法繼續檢查狀態,您的任務。一旦它返回true,你可以退出。這樣做:

while(!scheduledFuture.isDone()) { 
    // wait to return till the end of this loop 
} 

但是有一個風險在這裏,如果你的任務是永無止境的,那麼你將永遠無法恢復和servlet可能會超時。因此,要完成適當的定時等待任務。

+0

如何把正確的時間等待? – Pavel

0

經典的方式「繼續工作」是簡單地生成一個新的線程:

http://oreilly.com/catalog/jservlet/chapter/ch03.html

的Servlet可以做更多的不是簡單地訪問之間仍然存在。他們可以在訪問之間執行 。即使在發送響應之後,任何由servlet啓動的線程都可以繼續執行。這種能力 對長時間運行的任務證明最有用,其增量結果 應該可供多個客戶端使用。在init()中啓動的後臺線程 執行連續工作,而請求處理 線程使用doGet()顯示當前狀態。這與動畫小應用程序中使用的技術類似,其中一個線程更改 圖片,另一個線程更改繪製顯示。

在「ScheduledExecutorService」存在之前很久,這是真的。

問:你想做什麼ScheduledExecutorService(或者一個簡單的線程)沒有提供什麼?

+0

它會在我的應用程序的後臺發送電子郵件。我不想在發送電子郵件期間關閉服務器。 – Pavel