我有一個運行在兩個不同實例上的Spring Web應用程序。 這兩個實例不知道對方,它們運行在不同的服務器上。如何在應用程序有兩個實例時避免同時執行石英作業
該應用程序有一個預定的Quartz作業,但我的問題是作業不應該同時在這些實例上執行,因爲它是一個郵件發送作業,它可能會導致發送重複的電子郵件。
我使用RAMJobStore和JDBCJobStore不是我的選擇是由於大量的表,它需要(我不能能創造出很多的表,由於內部限制)
我想到的解決方案: - 創建單個控制表,必須在每次作業開始時檢查(具有可重複讀取隔離級別以避免併發問題)問題是,如果服務器被終止,則表可能處於無效狀態。
- 使用屬性將單個服務器定義爲作業運行服務器。問題是,如果該服務器宕機,作業將停止運行
有沒有人遇到過這個問題,你有什麼想法可以分享嗎?
我以這種方式解決了這個問題:在數據庫中爲作業創建了新表格。此表中的所有作業都有類似的字段(id,executionTime,isFailed,lastRun,isRunning)。如果isRunning等於TRUE,則意味着沒有人允許再次運行該作業 – Lugaru
這就是我上面描述的方法,但它有問題: - 需要同步訪問表(鎖) - 如果服務器意外關閉,表格處於不一致的狀態(如何處理) – eduardohl