前端时间做一个定时任务,觉得还挺有意思的,都是平时常用的东西,但是没有这么弄过,记录一下,有需要的人可以参考着用。
因为是生产使用,所以一些信息打码处理:
定时任务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的,即这些数据或许是已经重处理很多次了,我们要保证刚进来的数据优先处理掉,一直在重处理的数据慢慢来。