Java應用集群下的定時任務處理方案(mysql)
今天來說一個Java多機部署下定時任務的處理方案。
需求: 有兩臺服務器同時部署了同一套代碼, 代碼中寫有spring自帶的定時任務,但是每次執行定時任務時只需要一臺機器去執行。
當拿到這個需求時我腦子中立馬出現了兩個簡單的解決方案:
- 利用ip進行判斷, 兩臺機器ip肯定不一樣, 指定某一臺機器的ip運行。
- 只在一臺機器上部署定時任務的代碼。
最後兩個方案又都被自己否決了。 第一條,如果指定ip的機器出現了問題怎麽辦? 例如說宕機了, 那麽該制定ip的機器上的定時任務是不是就無法運行了?如果以後該服務器遷移導致ip變化怎麽辦?
第二條, 同上, 還有就是要維護兩套代碼很不方便。
因為上面兩個假設都不成立, 只能另找他法。 於是便想到利用mysql去解決, 之前了解過一點mysql的鎖機制, 知道如果有同時的兩個任務去寫數據庫中同一條記錄, 只有一條會成功, 這是利用了mysql的排他鎖。(詳細內容可以看下我的這篇文章:MySQL中的共享鎖與排他鎖)
下面就開始代碼演示, 這裏主要想給大家的是一個思路的提示, 代碼還是很簡單的。
- 首先需要單獨創建一張表
CREATE TABLE `t_schedule_cluster` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT [email protected]:主鍵‘,
`execute` int(1) NOT NULL COMMENT [email protected]:執行狀態‘,
`version` int(11) NOT NULL COMMENT [email protected]