网站引用优酷北京seo推广服务
最近要做一个定时任务处理的需求,在分页处理上。发现了大家容易遇到的一些"坑",特此分析记录一下。
场景
现在想象一下这个场景,你有一个定时处理任务,需要查询数据库任务表中的所有待处理任务,然后进行处理。
举个例子:生成用户的月度账单,并且要尽可能确保每个用户都能生成自己的账单,推送到用户的邮箱中。
分析
拿到这样一个任务之后,我们很自然的就想到了加一个定时任务,每隔一段时候处理这些任务。
任务肯定是先查询,再处理。处理完成之后,再更新任务状态。
关于查询
一般开始一个任务时,都是要有一个范围的,比如特定时间或特定用户。如果不界定范围,由于产线上的数据不断更新,我们的程序就会变得不可控!因此我们先要界定一个范围,然后再进行处理。
由于任务基数可能比较大,所以查询任务的时候,不能一次性全部读取到内存中,因此需要进行分页处理。
关于更新
任务更新的时候,考虑到并发,我们一般都要进行待状态更新,这样才能确定更新结果符合预期。如果更新结果不符合预期,还可以适当告警。
分页1.0
根据上面的需求,我们很容易就写出了如下v1.0代码(使用了PageHelper进行分页)。