解決 叢集 環境 定時任務 重複執行 的問題
阿新 • • 發佈:2019-02-09
問題描述:
公司專案,每天凌晨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的,終止定時任務即可。