CronExpression的坑

  最近接到了一项任务,针对已存在的定时任务进行重构。这里的规则设置没什么特别,设置任务开始时间、结束时间、时间间隔。一开始我的想法是使用quartz,很轻松就能解决这部分的问题,但是无奈原来代码太庞大,不敢随便动,只能延续之前的代码逻辑,也正是因为这个原因,我接触到了CronExpression。

  假如现在有1000条数据,他们都设置了不同的定时规则,在他们每日高频触发的情况下,选择quartz执行是很好的选择,如果其中某一条出现了问题,我们都可以具体处理;如果在每日低频的情况下,选择quartz+CronExpression或许是一个不错的想法。quartz每日定时发起几次请求,每次请求都将这1000条数据的cron拿出来,用CronExpression检验是否达标。虽然会在短期内占用大量系统资源,但是他的占用期集中,不会一直占用系统资源。在半夜或者凌晨执行这种任务也不会影响大家使用系统。

   下面直接上坑:

        1.CronExpression没有开始和结束时间,需要在外围手动约束

        2.CronExpression由于没有开始时间,所以他会有自己的计算cron表达式的逻辑

                举个例子:请看下面的代码,如果我在7月6号执行下面的代码,checkDate是2021/7/6,正常按照逻辑来讲statisfied是true,因为毕竟是第一天,肯定会满足这个cron。但是实际上statisfied是false。因为我们无法设置CronExpression的开始时间,而且开始时间与代码执行无关,如果checkDate是2021/7/7,statisfied就是true了,以此类推下一次是7.9、7.11.。。。。

CronExpression cronExpression = new CronExpression("0 0 0 /2 * ? ");
boolean satisfied=cronExpression.isSatisfiedBy(checkDate)

那么如果我们想要使用CronExpression验证像0 0 0 /2 * ? 这样的cron是否生效,我们应该怎么办?

测算当前日期和标准的偏移量。说白了就是,CronExpression验证逻辑没问题,但是起始日期不听我的,那我只能主动拥抱CronExpression,测算一下我与你的标准差多少。在验证的时候我把偏移量加上去进行验证,是不是就方便很多了。

你可能感兴趣的:(定时任务)