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 * * * ?
 
 

Java使用quartz实现作业调度的更多相关文章

  1. quartz开源作业调度框架的配置

    quartz开源作业调度框架的job服务实现,Quartz是一个完全由java编写的开源作业调度框架,使用时候需要创建一个实现org.quartz.Job接口的java类,Job接口包含唯一的方法: ...

  2. Quartz.NET作业调度框架详解(转)

    Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...

  3. java 多线程——quartz 定时调度的例子

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. Quartz.NET作业调度框架详解

    Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html

  5. .net Quartz 服务 作业调度

    .net项目中使用Quartz   (1)在web.config中进行相关配置 <configSections> <section name="quartz" t ...

  6. .NET Core开源Quartz.Net作业调度框架实战演练

    一.需求背景 人生苦短,我用.NET Core!作为一枚后端.NET开发人员,项目实践常遇到定时Job任务的工作,在Windows平台最容易想到的的思路Windows Service服务应用程序,而在 ...

  7. Quartz是一个完全由java编写的开源作业调度框架

    http://www.quartz-scheduler.org/ 找个时间研究一下

  8. java任务调度quartz框架的小例子

    quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...

  9. java框架---->quartz的使用(一)

    Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.今天我们就来学习一下它的使用,这里会分篇章对它进行介绍.只是希望能有个人,在我说没事的时候,知道我不 ...

随机推荐

  1. ios 信任charles https 证书

    https://www.charlesproxy.com/documentation/using-charles/ssl-certificates/ https://support.apple.com ...

  2. python3列表(元组)练习

    列表和元组一起练习l = [] 或者 li = list() 列表表示t = () 元组表示,元组不能修改,元组中只有两个方法 count().index(),同列表相同 li = [11,22,33 ...

  3. 超详细的遗传算法(Genetic Algorithm)解析

    https://blog.csdn.net/u010451580/article/details/51178225 https://www.jianshu.com/p/c82f09adee8f 00 ...

  4. 快速干掉Windows Defender

    1.快捷键Win+R,调出"运行"对话框,输入"gpedit.msc",打开组策略编辑器: 2.展开"计算机配置"→"管理模板&q ...

  5. ssh命令详解

    1.简介: Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的She ...

  6. Day05 -寻找自己:Ruby的self物件与singleton method

    前情提要:在第四天里,我们用参赛者的例子解说实体方法与类别方法.类别中的实体物件,想要玩弄方法时,可以有三种取用方式:(跟斯斯有三种一样) 该类别所定义的实体方法. 模块中可取得的实体方法.(关于模块 ...

  7. CS通用项目系统搭建——三层架构第一天

    CS通用项目:使用三层架构进行搭建 三层架构: 表现层(UI(User Interface)):展示给用户的层面,包含窗体控件数据等信息. 业务逻辑层(BLL(Business Logic Layer ...

  8. 网站改版应对google

    客户要求修改网站,这会给我们带来问题!为了保留他的网站权重和关键字排名,我们必须在做网站修改工作之前分析他原来网站的连接结构和标题,这样我才能更好地保证他原来网站的整体权重不会有大的变化!以下是我们根 ...

  9. hdu4622(hash解法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 Now you are back,and have a task to do:Given you ...

  10. JVM学习03:性能监控工具

    JVM学习03:性能监控工具 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 性能监控工具知识要点Xmind梳理 案例分析 案例分析1-JPS 案例分 ...