2013-07-10 17 views
0

我有一個運行在兩個不同實例上的Spring Web應用程序。 這兩個實例不知道對方,它們運行在不同的服務器上。如何在應用程序有兩個實例時避免同時執行石英作業

該應用程序有一個預定的Quartz作業,但我的問題是作業不應該同時在這些實例上執行,因爲它是一個郵件發送作業,它可能會導致發送重複的電子郵件。

我使用RAMJobStore和JDBCJobStore不是我的選擇是由於大量的表,它需要(我不能能創造出很多的表,由於內部限制)

我想到的解決方案: - 創建單個控制表,必須在每次作業開始時檢查(具有可重複讀取隔離級別以避免併發問題)問題是,如果服務器被終止,則表可能處於無效狀態。

- 使用屬性將單個服務器定義爲作業運行服務器。問題是,如果該服務器宕機,作業將停止運行

有沒有人遇到過這個問題,你有什麼想法可以分享嗎?

+1

我以這種方式解決了這個問題:在數據庫中爲作業創建了新表格。此表中的所有作業都有類似的字段(id,executionTime,isFailed,lastRun,isRunning)。如果isRunning等於TRUE,則意味着沒有人允許再次運行該作業 – Lugaru

+0

這就是我上面描述的方法,但它有問題: - 需要同步訪問表(鎖) - 如果服務器意外關閉,表格處於不一致的狀態(如何處理) – eduardohl

回答

1

從第二個解決方案開始(在除一個節點之外的所有節點上禁用qartz)。這非常簡單,而且安全。計算您的服務器停機的頻率。如果不可接受,請嘗試第一種解決方案。第一種解決方案的問題在於,您需要一個熟練的mutithreaded編程技巧來實現它,而不會出現任何錯誤。如果多線程不是您的日常任務,那並不那麼簡單。實施中的某個bug的成本可能會大於實際利潤。

相關問題