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