2015-10-21 31 views
1

我正在wildfly 8.2上開發Java EE 7應用程序,並且需要運行定期後臺任務。我注入執行人的服務和計劃任務,這部分工作正常:避免在ManagedScheduledExecutorService中重複執行任務

@Resource 
private ManagedScheduledExecutorService executorService; 

... 

executorService.scheduleWithFixedDelay(() -> { 
    try { 
    // do some stuff 
    } catch (Throwable t) { 
    log.error("Error", t); 
    } 
}, 0, 1, TimeUnit.MINUTES); 

現在(居然不錯)的特點是,在重新部署計劃的任務被保存,因此仍定在新的部署。

但是我該如何檢測是否已經安排了任務以避免多次調度?

我試圖用ScheduledFuture和取消@PreDestroy@PrePassivate

reloadTreeFuture = executorService.scheduleWithFixedDelay(() -> { 

... 

@PreDestroy 
@PrePassivate 
protected void shutdown() { 
    reloadTreeFuture.cancel(true); 
} 

這是工作,只要細如相應的任務是在非常時刻取消被激發不執行任務。由於任務長時間運行並且頻繁運行,因此在執行過程中擊中它的機會有點高。

如果在任務仍在執行時取消被取消,取消似乎什麼也不做。它立即返回並且方法ScheduledFuture.isDone()也返回true,但是從日誌中我可以看到該任務仍在後臺執行,直到它遇到需要注入的Bean的點,而該注入的Bean由於取消部署過程而不可用。該過程然後以org.jboss.msc.service.ServiceNotFoundException - 結束,但仍然計劃在

reloadTreeFuture.cancel(true); 
    while (!reloadTreeFuture.isDone()) { 
    Thread.sleep(200); // I know this is bad - it's just for testing 
    } 

所以基本的問題:我怎麼能確保任務沒有預定的兩倍(甚至更多)?

回答

0

您可以記下每個任務的ID並在執行前檢查它們。當然,這可能不是最好的解決方案,但它的工作原理。