spring boot中使用quartz实现作业调度的功能,简单易用。

什么是Quartz?

Quartz是Java领域最著名的、功能丰富的、开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成——从小的单机应用到大的电子商务系统。 Quartz可以用来执行成百上千甚至数万的级别的、简单或者复杂的作业调度,一个Job可以执行任意的你所编程的任务。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。

Quartz的主要角色有:

  1. Job:被调度的任务,重写其中execute方法,每次调度时会执行该方法;
  2. JobDetail:一个Job的具体化,可以这么看,JobDetail = Job + JobData
  3. Scheduler:调度器
  4. SchedulerFactory:调度工厂
  5. 各种ScheduleBuilder:CronScheduleBuilder(支持cron表达式的调度器)、CalendarIntervalScheduleBuilder(支持时间间隔的调度器)、SimpleScheduleBuilder(最简单的触发器,可以设置间隔,重复次数)
  6. Trigger:触发器,用于定义任务调度和时间规则,可以这么看,Trigger = ScheduleBuilder + Time

每个JobDetail都可以被唯一标识且指定一个抽象的Job,每个Trigger也都可以被唯一标识,Scheduler将JobDetail和Trigger绑定在了一起,即当trigger发生时,会调用JobDetail对应的Job的execute方法。

初始化一个调度器,需要JobDetail和Trigger:

scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();

初始化一个JobDetail:

this.jobDetail = newJob(SnapshotPolicyJob.class)
.withIdentity(snapshotPolicyEntity.getId() + "-snapshot", snapshotPolicyEntity.getService())
.usingJobData("service", snapshotPolicyEntity.getService())
.usingJobData("directory", getDirectoryPrefix(snapshotPolicyEntity.getProject()) + snapshotPolicyEntity.getDirectory())
.build(); //可以通过JobDetail给Job传参数,简单类型通过JobData传,复杂类型通过JobDataMap传:
JobDataMap jobDataMap = this.jobDetail.getJobDataMap();
jobDataMap.put("snapshotPolicyEntity", snapshotPolicyEntity);
jobDataMap.put("snapshotHistoryRepository", snapshotHistoryRepository);
jobDataMap.put("snapshotPolicyRepository", snapshotPolicyRepository);
jobDataMap.put("configuration", configuration);

每一个JobDetail对应了一个Job:

public class SnapshotPolicyJob implements Job{

    @Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// ...
}
}

初始化一个Trigger,需要调度规则:

this.trigger = newTrigger()
.withIdentity(snapshotPolicyEntity.getName(), snapshotPolicyEntity.getService())
.startAt(BackupUtils.now())
.withSchedule(cronBuilder)
.build();

初始化一个调度规则:

cronExp = "0 " + minute + " " + hour + " " + day + " * ?";
cronBuilder = CronScheduleBuilder.cronSchedule(cronExp);

这样,调度流程就串了起来,在满足调度条件后,会执行调度任务的作业。

默认情况下,调度信息是保留在内存中的,可以通过配置将调度信息持久化到数据库中。

在Spring boot中如何使用Quartz?

在pom.xml添加依赖:

<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>

之后就可以通过代码实现业务逻辑,这里需要注意的是:在Job内,不能使用spring的注入机制注入对象,必须通过JobDataMap的方式由JobDetail传给Job相应的复杂类型的对象。

什么是cron表达式?

CronTrigger 能够提供比 SimpleTrigger 更有具体实际意义的调度方案,调度规则基于 Cron 表达式。

Quartz的cron表达式的格式十分类似于 UNIX的cron表达式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而 UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒)。

另一个与 UNIX的cron表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(分、时、日、月和周),Quartz 提供七个域。如下图所示:

注意,从左到右依次是:

秒   分   时   日   月   周   年

其中第七个域(年)可以省略为空,即这样两个cron表达式是等效的:

六个域:0 3 * * * ?
七个域:0 3 * * * ? *

比如:

按月调度:每月1号8点10分调度

0 10 8 1 * ?

按周调度:每周一8点10分调度

0 10 8 * * 1

注意:1-7 对应 SUN-SAT,即1是周日,7是周六

按日调度:每日8点10分调度

0 10 8 * * ?

按小时调度:每小时的第10分调度

0 10 * * * ?
 
 

最新文章

  1. 找出只含有2,3,5因子构成的数的第N个
  2. net面试题
  3. rabbitmq binary/other_system内存占用很高
  4. js-JavaScript高级程序设计学习笔记16
  5. 63.Hbase 常用命令
  6. 老爷车IE8如何兼容图标字体
  7. DEV--GerdView控件
  8. [c/c++]指针数组 pk 数组指针
  9. Python中的并发编程
  10. Mysql InnoDB彻底释放磁盘空间
  11. Two ways to create file using &#39;doc&#39;.
  12. python代码合并
  13. NetAnalyzer笔记 之 十 通过邮件方式打造自己的bug反馈模块(C#)
  14. IO-04. 混合类型数据格式化输入
  15. js判断空值
  16. Zookeeper学习
  17. MTK(android init.rc) 写一个开机启动的服务
  18. (a ==1 &amp;&amp; a== 2 &amp;&amp; a==3) 有可能是 true 吗?
  19. Leetcode 75.颜色分类 By Python
  20. day_5.25py

热门文章

  1. 魔力Python--斐波那契数列(全)
  2. mysql 线程操作
  3. Centos 7 安装composer和Laravel
  4. sublime_text3代码自动补全
  5. springboot配置swagger
  6. ARM-start.s注释(2410Init.s)
  7. SSM商城项目(十二)
  8. thinkphp5 or
  9. DOM节点遍历
  10. 通过.ibd和.frm恢复mysql数据