让定时任务 xxl job 里面的任务灵活起来

Posted carl-zhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让定时任务 xxl job 里面的任务灵活起来相关的知识,希望对你有一定的参考价值。

在项目当中使用定时任务进行业务补偿是一种很常见的需求。对于一个任务,我们常常把开始时间或者结束时间固定在代码里面。如果出现了定时任务漏掉了数据。比如:

  • 定时任务:查询 1 天前到当前系统时间
  • 遗漏的数据:在 3 天前有一些数据还没有执行完成

如果你没有把开始时间设置成动态变量这个问题就无法解决。你可以通过把开始时间配置在注册中心当中,查询时间就是:3天前 ~ 系统当前时间。这个 SQL 的查询系统就比较低下了。

还有一种方式就是开始时间与结束时间都设置成变量配置在注册中心当中,这样就可以动态定制你的任务查询的开始与结束时间。

但是任务这个参数是配置在注册中心好?还是配置在任务里面好呢?我个人是比较倾向于后者的。原因有以下几点:

  • 使用配置中心配置,每个任务都配置不同的变量,添加代码量不太优雅
  • 使用任务里面的动态参数配置,这样修改任务的执行逻辑就是离任务最近,就近原则。

所以对于定时任务,我们需要定制以下几个参数:

  • 参数1:业务号:优先级最高,有可能之前定时任务执行中漏了一条数据。这个时候,如何 xxl job 的任务参数传递过来了业务号。那么就只执行这个业务号
  • 参数2:每页查询条数:执行定时任务的时候,如果我们查询的时间范围过广,查询出来的数据也可能会很多,所以我们查询数据引入分页这个概念,每次只查询 1 页且查询条数可配置。
  • 参数3:查询开始时间:定时任务就是需要操作某类数据一段时间的数据,所以有开始时间。
  • 参数4:查询结束时间:定时任务就是需要操作某类数据一段时间的数据,所以有结束时间。

当执行定时任务的时候,要么只有 参数 1 否则就是 参数2、3、4。就是要么执行特定的一条数据或者执行一定时间段且最大条数是 参数2 的值。

针对上面 4 个参数可以定制化,那么请求参数设置:

JobParamModel.java

public class JobParamModel {
 
    /** 引用号,订单领域可以理解为订单号 */
    private String referenceNo;
 
    /** 基准时间(结束时间) yyyy-MM-dd HH:mm:ss */
    private String basicTime;
 
    /** 向前偏移量 */
    private Integer forwardOffset;
 
    /** 向前偏移单位 */
    private String forwardOffsetUnit;
 
    /** 向后偏移量 */
    private Integer backwardOffset;
 
    /** 向后偏移单位 */
    private String backwardOffsetUnit;
 
    /** 是否为全闭区间时间段 */
    private boolean wholeClosedRange;
 
    /** 分页数 */
    private int pageSize = 500;
 
}

下面我们就来分析一下各个参数的作用。

  • referenceNo:引用号,订单领域可以理解为订单号:比如你的定时任务,只需要一个订单号进行执行。那么只需要配置为这个参数就行了。它的优先级应该是最高。
  • basicTime:基准时间,也就是我们的结束时间,这个时间可以自己设置,如果不设置基准时间,默认使用系统当前时间为基准时间
  • forwardOffset:向前偏移量,基于基准时间获取定时任务执行的开始时间,与 forwardOffsetUnit 配合使用。就是基准时间向前偏移多个时间单位(目前支持:秒(SECONDS)、分(MINUTES)、时(HOURS)、天(DAYS))。比如基准时间是:2021-05-19 13:00:01 ,偏移量是 10 ,然后向前偏移单位是时(HOURS),查询的开始时间就是: 2021-05-19 03:00:01。如果没有配置,默认的开始时间是基准时间减去 24 个小时,也就是查询最近一天的数据。
  • forwardOffsetUnit:向前偏移单位,目前支持:秒(SECONDS)、分(MINUTES)、时(HOURS)、天(DAYS)
  • backwardOffset:向后偏移量,基于基准时间获取定时任务执行的结束时间,与 backwardOffsetUnit 配合使用。就是基准时间向后偏移多个时间单位(目前支持:秒(SECONDS)、分(MINUTES)、时(HOURS)、天(DAYS))。比如基准时间是:2021-05-19 13:00:01,偏移量是 -5,然后向后偏移单位是天(DAYS),查询的结束时间就是:2021-05-14 13:00:01。如果没有配置默认结束时间就是基准时间。
  • backwardOffsetUnit:向后偏移单位,目前支持:秒(SECONDS)、分(MINUTES)、时(HOURS)、天(DAYS)
  • wholeClosedRange:是否为全闭区间时间段,意思就是把开始时间设置为当天的 00:00:00,把结束时间设置为 23:59:59。比如 wholeClosedRange 为 false 时间段为: 2021-05-18 13:00:01 ~ 2021-05-19 13:00:01 .当设置该值为 true 时,查询的时间段为:2021-05-18 00:00:00 ~ 2021-05-19 23:59:59
  • pageSize:查询条数,默认查询 500 条,可以由定时任务的参数传入也可以在查询条件中传入自定义的查询条数。

注意:如果定时任务传递的参数不合法默认会查询最近 1 天的 500 条数据。

举例说明:

情况1:{“basicTime” : “2021-05-19 13:00:00”, “forwardOffset” : 5, “forwardOffsetUnit” : “HOURS”}

查询条件: 2021-05-19 08:00:00 ~ 2021-05-19 13:00:00(系统时间不影响查询条件)

情况2:{“forwardOffset” : 5, “forwardOffsetUnit” : “HOURS”} 系统时间:2021-06-30 20:59:11

查询条件:2021-06-30 15:59:11 ~ 2021-06-30 20:59:11(系统时间影响查询条件)

情况3:{“forwardOffset” : 5, “forwardOffsetUnit” : “DAYS”, “backwardOffset”: -2, “backwardOffsetUnit”:“HOURS”} 系统时间:2021-06-30 20:59:11

查询条件:2021-06-25 20:59:11 ~ 2021-06-30 18:59:11(系统时间影响查询条件)

情况4:{“forwardOffset” : 5, “forwardOffsetUnit” : “DAYS”, “backwardOffset”: -2, “backwardOffsetUnit”:“HOURS”, “wholeClosedRange”} 系统时间:2021-06-30 20:59:11

查询条件:2021-06-25 00:00:00 ~ 2021-06-30 23:59:59(系统时间影响查询条件)

本文只是提供一种思路,实现方式其实挺简单的。

以上是关于让定时任务 xxl job 里面的任务灵活起来的主要内容,如果未能解决你的问题,请参考以下文章

定时任务管理工具 xxl_job 的使用

分布式任务调度系统XXL-Job快速入门体验

【基建—xxl-job定时任务平台】

xxl-job(许雪里开发),分布式任务调度平台+定时任务

面试应该知道的任务调度平台

SpringBoot定时任务 - 开箱即用分布式任务框架xxl-job