2012-03-28 40 views
1

我有一個ScheduledExecutorService,我每15分鐘執行一次任務(在Tomcat的Web應用程序中)。
ServletContextListenercontextDestroyed我做:關閉程序在執行程序中如何工作?

Runtime.getRuntime().addShutdownHook(new Thread(){ 
      @Override 
      public void run(){ 
       scheduler.shutdown(); 
      } 
     });  

啓動調度程序,如:

final Runnable r = new Runnable(){ 

      @Override 
      public void run() { 
       System.out.println("My task"); 
       //Do some task 
      } 

     }; 
updater.scheduleWithFixedDelay(r, 30, 15, TimeUnit.MINUTES); 

問題:在shutdown不執行任何餘下的任務。
有一個任務正在運行,但我沒有看到任何日誌,所以它似乎沒有執行。爲什麼?

UPDATE:
如果我啓動tomcat再經過2分鐘,我關機則是不被視爲計劃和必須運行的任務?我的意思是,如果提交任務不被視爲等待?或者它必須實際運行?

回答

0

我不能完全解析你的問題,但也許你的應用程序沒有像你期望的那樣退出?

關閉Executor將停止提交任何任務,但任何正在運行的任務將繼續運行,直到它們退出。從shutdown()的javadoc:

發起以前提交 任務的執行一個有序的關閉,但沒有新的任務將被接受。 如果已關閉,調用沒有其他影響。

如果你編輯你的問題更清楚,我們可以更合適地回答。

+0

我Tomcat.The關機時運行的是裏面的ServletContextListener。我停止使用'shutdown' – Jim 2012-03-28 13:20:26

+0

通常,您需要實現自己的邏輯,以1)處理隊列中的所有(或超時)未處理的消息或2)保存消息並在應用程序重新啓動時處理它們(通常通過持久隊列的JMQ完成) – AngerClown 2012-03-28 13:21:00

+0

我還是不太理解你的問題@Jim。你可以編輯問題,並更精確?你提供關機代碼,但也許你的問題是你的後臺任務根本沒有運行? – Gray 2012-03-28 13:23:35

1

要明確等到所有正在運行的任務完成後,做這樣的事情:

try { 
    // Wait for one second indefinitively 
    while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) { 
    // wait until completion 
    } 
} catch (final InterruptedException ex) { 
    // interrupted... you may log something 
} 
相關問題