因為自己有csdn和博客園兩個博客, 所以兩邊都會發(fā)一下。 csdn地址: http://blog.csdn.net/u012881584/article/details/70194237
今天來說一個Java多機部署下定時任務(wù)的處理方案。
需求: 有兩臺服務(wù)器同時部署了同一套代碼, 代碼中寫有spring自帶的定時任務(wù),但是每次執(zhí)行定時任務(wù)時只需要一臺機器去執(zhí)行。
當拿到這個需求時我腦子中立馬出現(xiàn)了兩個簡單的解決方案:
利用ip進行判斷, 兩臺機器ip肯定不一樣, 指定某一臺機器的ip運行。
只在一臺機器上部署定時任務(wù)的代碼。
最后兩個方案又都被自己否決了。 第一條,如果指定ip的機器出現(xiàn)了問題怎么辦? 例如說宕機了, 那么該制定ip的機器上的定時任務(wù)是不是就無法運行了?如果以后該服務(wù)器遷移導(dǎo)致ip變化怎么辦?
第二條, 同上, 還有就是要維護兩套代碼很不方便。
因為上面兩個假設(shè)都不成立, 只能另找他法。 于是便想到利用mysql去解決, 之前了解過一點mysql的鎖機制, 知道如果有同時的兩個任務(wù)去寫數(shù)據(jù)庫中同一條記錄, 只有一條會成功, 這是利用了mysql的排他鎖。(詳細內(nèi)容可以看下我的這篇文章:MySQL中的共享鎖與排他鎖)
下面就開始代碼演示, 這里主要想給大家的是一個思路的提示, 代碼還是很簡單的。
首先需要單獨創(chuàng)建一張表
CREATE TABLE `t_schedule_cluster` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '@cname:主鍵', `execute` int(1) NOT NULL COMMENT '@cname