多个定时任务通过sql取模同时扫一张表

前端时间做一个定时任务,觉得还挺有意思的,都是平时常用的东西,但是没有这么弄过,记录一下,有需要的人可以参考着用。

因为是生产使用,所以一些信息打码处理:

 定时任务0:

remainder是数据库的自增id
count是查询的条数,即limit 后面的值
rehandNumber是重处理次数

对应的sql: 

 

这个定时任务的作用就是处理id取模为0的数据,结合该sql:

WHERE state=0 and mod(id,5)=#{remainder,jdbcType=INTEGER}

mod(id,5)即id%5 余0。

然后下面的定时任务1,2,3就是分别取id%5余 1 2 3的数据,这样就可以通过多个定时任务去扫描处理同一张表的数据,并且多个定时任务自己处理自己的,不会出现多个定时任务处理同一条数据的情况。

定时任务1:

对应的sql是一样的

可以一直这么写下去,定时任务2,3,4,5...

取决于你的数据量,我们这里是写了5个这样的定时任务。

这里还有另一个注意的地方:

如下,这段代码,睡眠50毫秒,这是为了GC能够有时间回收,在while里面,一直循环,可能会出现GC无法处理的情况,所以这里睡50毫秒。

try {
   Thread.sleep(50);
} catch (Exception e) { }

然后在这下面又来了一条查询,只是传入的remainder(重处理次数)不同,这是干什么呢?

这是为了优先处理刚进来的数据,不让刚进来的数据队列卡住。

remainder=0就是重处理次数为0,即数据刚进来,还没有处理;第一条查询传的是remainder=26

即查询的是冲处理次数小于26的,即这些数据或许是已经重处理很多次了,我们要保证刚进来的数据优先处理掉,一直在重处理的数据慢慢来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值