我正在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
}
所以基本的問題:我怎麼能確保任務沒有預定的兩倍(甚至更多)?