解决 集群 环境 定时任务 重复执行 的问题

来源:互联网 发布:java中什么叫泛型 编辑:程序博客网 时间:2024/05/22 06:14

问题描述:

公司项目,每天凌晨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的,终止定时任务即可。

阅读全文
0 0