ApiBoot 整合 Quartz 分布式任务调度框架

ApiBoot内部集成了Quartz,提供了数据库方式内存方式的进行任务的存储,其中数据库方式提供了分布式集群任务调度,任务自动平滑切换执行节点。

引用ApiBoot Quartz

pom.xml配置文件内添加,如下配置:

  1. <!--ApiBoot Quartz-->
  2. <dependency>
  3. <groupId>org.minbox.framework</groupId>
  4. <artifactId>api-boot-starter-quartz</artifactId>
  5. </dependency>

注意:如果未添加ApiBoot版本依赖,请访问版本依赖查看添加方式。

备注:如果使用ApiBoot Quartz的内存方式,仅需要添加上面的依赖即可。

相关配置

参数名称是否必填默认值描述
api.boot.quartz.job-store-typememory任务存储源方式,默认内存方式
api.boot.quartz.scheduler-namescheduler调度器名称
api.boot.quartz.auto-startuptrue初始化后是否自动启动调度程序
api.boot.quartz.startup-delay0初始化完成后启动调度程序的延迟。
api.boot.quartz.wait-for-jobs-to-complete-on-shutdownfalse是否等待正在运行的作业在关闭时完成。
api.boot.quartz.overwrite-existing-jobsfalse配置的作业是否应覆盖现有的作业定义。
api.boot.quartz.jdbc配置数据库方式的Jdbc相关配置
api.boot.quartz.prop.job-store-classorg.quartz.impl.jdbcjobstore.JobStoreTX任务数据源类
api.boot.quartz.prop.job-store-cluster-checkin-interval20000集群检查时间
api.boot.quartz.prop.scheduler-instance-idAUTO调度器ID
api.boot.quartz.prop.scheduler-instance-namejobScheduler调度器名称
api.boot.quartz.prop.job-store-table-prefixQRTZ_表结构前缀
api.boot.quartz.prop.job-store-clusteredtrue是否开启任务数据集群
api.boot.quartz.prop.job-store-driver-delegate-classorg.quartz.impl.jdbcjobstore.StdJDBCDelegate任务数据源驱动类
api.boot.quartz.prop.thread-pool-threads-inherit-context-class-loader-of-initializing-threadtrue线程继承上下文类加载或定义线程

内存方式

ApiBoot Quartz在使用内存方式存储任务时,不需要做配置调整。

数据库方式

需要在application.yml配置文件内修改api.boot.quartz.job-store-type参数,如下所示:

  1. api:
  2. boot:
  3. quartz:
  4. # Jdbc方式
  5. job-store-type: jdbc

Quartz所需表结构

Quartz的数据库方式内部通过DataSource获取数据库连接对象来进行操作数据,所操作数据表的表结构是固定的,ApiBootQuartz所支持的所有表结构都进行了整理,访问Quartz支持数据库建表语句列表查看,复制执行对应数据库语句即可。

创建任务类

我们只需要让新建类集成QuartzJobBean就可以完成创建一个任务类,如下简单示例:

  1. /**
  2. * 任务定义示例
  3. * 与Quartz使用方法一致,ApiBoot只是在原生基础上进行扩展,不影响原生使用
  4. * <p>
  5. * 继承QuartzJobBean抽象类后会在项目启动时会自动加入Spring IOC
  6. *
  7. * @author:恒宇少年 - 于起宇
  8. * <p>
  9. * DateTime:2019-03-28 17:26
  10. * Blog:http://blog.yuqiyu.com
  11. * WebSite:http://www.jianshu.com/u/092df3f77bca
  12. * Gitee:https://gitee.com/hengboy
  13. * GitHub:https://github.com/hengboy
  14. */
  15. public class DemoJob extends QuartzJobBean {
  16. /**
  17. * logger instance
  18. */
  19. static Logger logger = LoggerFactory.getLogger(DemoJob.class);
  20. @Override
  21. protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  22. logger.info("定时任务Job Key : {}", context.getJobDetail().getKey());
  23. logger.info("定时任务执行时所携带的参数:{}", JSON.toJSONString(context.getJobDetail().getJobDataMap()));
  24. //...处理逻辑
  25. }
  26. }

任务参数

在任务执行时传递参数是必须的,ApiBoot Quartz提供了比较方便的传递方式,不过最终Quartz会把传递的值都会转换为String类型数据。

任务Key默认值

ApiBoot QuartznewJob方法所创建的定时任务,如果在不传递Job Key参数时,会默认使用UUID随机字符串作为Job Key以及Trigger Key

自定义任务开始时间

任务开始时间可以通过startAtTime方法进行设置,在不设置的情况下,任务创建完成后会立刻执行。

Cron 表达式任务

创建Cron类型任务如下所示:

  1. String jobKey = apiBootQuartzService.newJob(ApiBootCronJobWrapper.Context()
  2. .jobClass(DemoJob.class)
  3. .cron("0/5 * * * * ?")
  4. .param(
  5. ApiBootJobParamWrapper.wrapper().put("param", "测试"))
  6. .wrapper());

Cron 表达式任务由ApiBootCronJobWrapper类进行构建。

上面的DemoJob任务类将会每隔5秒执行一次。

Loop 重复任务

Loop循环任务,当在不传递重复执行次数时,不进行重复执行,仅仅执行一次,如下所示:

  1. String jobKey = apiBootQuartzService.newJob(
  2. ApiBootLoopJobWrapper.Context()
  3. // 参数
  4. .param(
  5. ApiBootJobParamWrapper.wrapper()
  6. .put("userName", "恒宇少年")
  7. .put("userAge", 24)
  8. )
  9. // 每次循环的间隔时间,单位:毫秒
  10. .loopIntervalTime(2000)
  11. // 循环次数
  12. .repeatTimes(5)
  13. // 开始时间,10秒后执行
  14. .startAtTime(new Date(System.currentTimeMillis() + 10000))
  15. // 任务类
  16. .jobClass(DemoJob.class)
  17. .wrapper()
  18. );

Loop 任务由ApiBootLoopJobWrapper类进行构建。

上面的定时任务将会重复执行5次,连上自身执行的一次也就是会执行6次,每次的间隔时间为2秒,在任务创建10秒后进行执行。

Once 一次性任务

Once一次性任务,任务执行一次会就会被自动释放,如下所示:

  1. Map paramMap = new HashMap(1);
  2. paramMap.put("paramKey", "参数值");
  3. String jobKey = apiBootQuartzService.newJob(
  4. ApiBootOnceJobWrapper.Context()
  5. .jobClass(DemoJob.class)
  6. // 参数
  7. .param(
  8. ApiBootJobParamWrapper.wrapper()
  9. .put("mapJson", JSON.toJSONString(paramMap))
  10. )
  11. // 开始时间,2秒后执行
  12. .startAtTime(new Date(System.currentTimeMillis() + 2000))
  13. .wrapper()
  14. );

Once 任务由ApiBootOnceJobWrapper类进行构建。

在参数传递时可以是对象、集合,不过需要进行转换成字符串才可以进行使用。

暂停任务执行

任务在执行过程中可以进行暂停操作,通过ApiBoot Quartz提供的pauseJob方法就可以很简单的实现,当然暂停时需要传递Job KeyJob Key可以从创建任务方法返回值获得。

暂停任务如下所示:

  1. // 暂停指定Job Key的任务
  2. apiBootQuartzService.pauseJob(jobKey);
  3. // 暂停多个执行中任务
  4. apiBootQuartzService.pauseJobs(jobKey,jobKey,jobKey);

恢复任务执行

任务执行完暂停后,如果想要恢复可以使用如下方式:

  1. // 恢复指定Job Key的任务执行
  2. apiBootQuartzService.resumeJob(jobKey);
  3. // 恢复多个暂停任务
  4. apiBootQuartzService.resumeJobs(jobKey,jobKey,jobKey);

修改Cron表达式

修改Cron表达式的场景如下:

  • 已创建 & 未执行
  • 已创建 & 已执行修改方法如下所示:
  1. // 修改执行Job Key任务的Cron表达式
  2. apiBootQuartzService.updateJobCron(jobKey, "0/5 * * * * ?");

删除任务

想要手动释放任务时可以使用如下方式:

  1. // 手动删除指定Job Key任务
  2. apiBootQuartzService.deleteJob(jobKey);
  3. // 手动删除多个任务
  4. apiBootQuartzService.deleteJobs(jobKey,jobKey,jobKey);

删除任务的顺序如下:

  • 暂停触发器
  • 移除触发器
  • 删除任务