2014-10-30 59 views
1

我有一個使用Java Timer的批處理程序(程序插入/更新/查詢數據庫)計劃,每天觸發一次。 這個批處理程序運行在Apache Tomcat的兩個不同的服務器上。控制在不同服務器上運行在不同JVM上的批處理程序的執行

現在我的問題是Java Timer API在兩臺服務器中並行觸發作業,因此我的程序執行了兩次,因此我得到了兩次使用不同主鍵處理的相同記錄。

我需要確保我的程序只觸發一次,觸發應動態發生,而不管服務器。 一旦開始一個批次,其他人不應該開始或其他人不應該得到處理。

在這裏, Tomcat託管在兩臺服務器上,每臺服務器都部署相同的應用程序 我有一個數據庫,這兩個服務器共享。

使用Java和spring。

需要建議/幫助解決上述問題。

回答

0

使用作業調度庫,如Quartz,它支持集羣環境中的運行作業。
石英有能力確保只有一個節點將運行該作業,從而防止重複執行作業。你可以閱讀更多關於這個here
Spring通過TaskExecutor和TaskScheduler接口爲異步執行和任務調度提供抽象。 Spring還具有用於支持Quartz Scheduler調度的集成類。欲瞭解更多信息,請看看here

如果您希望繼續使用Java定時器,您必須自己處理同步。公用解決方案使用共享鎖數據庫表。當2個節點同時嘗試從鎖表讀/寫時,必須小心不要碰到併發問題。

+0

謝謝,但我想同樣在Java定時器本身實現。 – 2014-10-31 06:39:10

相關問題