1. 程式人生 > >解決 叢集 環境 定時任務 重複執行 的問題

解決 叢集 環境 定時任務 重複執行 的問題

問題描述:

公司專案,每天凌晨1點會執行一條定時任務。該任務會找到當天生日的人,並加上積分。

起初,經過開發環境,測試環境發現都沒問題能夠正常執行。但是到了生產環境發現,加積分

的每個人都加了4次。

原因

生產環境用的是叢集環境,一共部署到了4臺伺服器上,因此同一時間點,同一個定時任務

會被重複執行4次。

解決辦法:

鎖。

資料庫新建一張表。

CREATE TABLE `t_lock` (
  `key` varchar(15) NOT NULL COMMENT '定時任務Key',
  `utime` bigint(20) NOT NULL COMMENT '用於樂觀鎖的時間',
  UNIQUE KEY `lockUniq` (`key`,`utime`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

因為我們有3個定時任務。因此,這裡用一個欄位key來區分是哪一個定時任務。

utime欄位用於更新操作。每天凌晨1點,(4個)定時任務傳入當天日期(utime初始時間是很小的一個日期),

比如傳入:utime=20171027。此時執行sql語句:

update
      `t_lock`
set
       `utime` = #{utime}
where
       `key`=#{key} and `utime`<#{utime}
此時4個定時任務中,只會有一個定時任務A操作成功,並返回1。

其他3個定時任務,操作不成功返會0。

然後,只需要根據返回值,讓返回值為1的繼續執行定時任務。

返回值為0的,終止定時任務即可。