2013-02-20 62 views
1

我有一個奇怪的問題。Eclipse:ScheduledExecutorService.scheduleWithFixedDelay不會刪除發佈

我有一個ScheduledExecutorService.scheduleWithFixedDelay,當我單擊發布/停止重新啓動服務器時,不會「停止」。

當我重新發布時,會有2個服務正在運行,並且運行相同服務的數量取決於我點擊發布的次數。

停止並啓動服務器後,這並不會消失。

我必須關閉eclipse並打開才能停止它,並且我發現只有在編輯初始化服務的類後纔會發生這種情況。

我無法粘貼代碼,但很簡單..只是一個Singleton並保持服務

private final ScheduledExecutorService scheduler = 
     Executors.newScheduledThreadPool(1); 

scheduler.scheduleAtFixedRate(new Runnable() { 
       public void run() { system.out("hello" } 
      }, 60 * 60, SECONDS); 

我不能似乎找到了問題,有人可以幫我請。

+0

您的部署過程必定有問題。停止和啓動服務器務必停止服務,除非您的部署過程每次單擊發布時多次發佈該應用程序。只有在知道您的安裝(內部/外部啓動,tomcat/jboss)時才能進行調試。 – 2013-02-20 10:23:41

回答

2

當應用程序被取消部署時,您應該關閉調度程序。更簡單的方法是申報工具ServletContextListener,然後關閉contextDestroyed()方法中的計劃程序。

+0

是的,我確實考慮過這一點,但我不明白爲什麼我需要這樣做,因爲我個人覺得API應該能夠處理它。 – seesee 2013-02-20 17:06:02

+0

哪個API?容器如何知道你產生了線程? – 2013-02-20 17:06:57

+0

我的意思是ScheduledExecutorService ...這是唯一的解決方案嗎?下面的解決方案會工作嗎? – seesee 2013-02-20 17:13:09

1

Executors.newScheduledThreadPool(1);創建了一個非守護工作者線程,它可以防止JVM的關閉,除非您關閉調度明確

scheduler.shutdown(); 

alternatevely,您可以在此情況下,請執行下列操作

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, 
      new ThreadFactory() { 
       public Thread newThread(Runnable r) { 
        Thread t = new Thread(r); 
        t.setDaemon(false); 
        return t; 
       } 

      }); 

工作線程將是一個守護進程並且在程序結束時不會阻止JVM退出

+0

我更喜歡set Daemon解決方案,但有什麼我應該注意的?當我重新發布時線程會停止嗎? – seesee 2013-02-20 17:29:50