2015-11-13 48 views
1

我想安排每X小時執行一次的週期性任務。我有一個用Java編寫的服務,我正在考慮創建一個長期運行的後臺線程,只要服務啓動就會一直運行。我如何確保我們每X小時執行一次任務?我的主機上的時鐘漂移是我應該擔心的問題嗎?我知道,如果CPU正在努力工作,時鐘滴答的頻率可能會改變。調度週期性任務和時鐘漂移

編輯:我正在考慮在我的彈簧配置中添加一個bean來啓動定期執行我的任務的線程。

+1

這個小時的任務有多重要?還是說它每60分鐘執行一次,它們之間可以接受多少時間(例如,可以在0分鐘,59.9分鐘和120.3分鐘時間內執行)? –

+0

一些更多的背景 - 任務不需要在一小時內被解僱。我們有一個每24小時刷新一次報告的SLA,因此每24小時(每隔幾秒鐘甚至幾分鐘就可以接受),我們需要發出一批服務請求。 – mewsicalcat

+0

考慮到我們只關心任務之間的時間間隔,如果時鐘偏移是一個問題? – mewsicalcat

回答

3

Java提供了一個java.util.Timer類,用於在後臺線程上執行任務。其中一種操作模式是「定期重複執行」。根據您的具體需求,可以使用固定延遲和固定比率執行方法。

Java 5增加了一個java.util.concurrent.ScheduledThreadPoolExecutor類,它比Timer更靈活,但也提供固定延遲和固定速率執行方法。

如果您需要這些不適合的精確時機,我不確定Java是否是合適的解決方案。你將開始進入實時系統的領域。此時,您應該可能正在尋找其他選項。

0

如果您擔心,請編寫測試流程並在目標平臺上運行測試流程。使用您計劃用於實際流程的功能(如ScheduledExecutorService),計劃任務以每24小時記錄一次主機時間。如果主機不使用NTP保持其時鐘同步,也許您也可以撥打一個計時的Web服務並記錄。幾天之後,您應該很清楚您是否需要一種方法來糾正漂移。

我的猜測是,內置調度程序將精確到每秒少於一秒。

+0

好主意!找出它是否會成爲問題的最好方法是自己測試一下。謝謝:) – mewsicalcat

+0

@mewsicalcat計時器的準確度和分辨率取決於系統。沒有一點測試我就不會相信樹莓派。對於真正的服務器,我不會再考慮它。 – erickson