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:

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

初始化一个JobDetail:

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

每一个JobDetail对应了一个Job:

  1. public class SnapshotPolicyJob implements Job{
  2. @Override
  3. public void execute(JobExecutionContext context) throws JobExecutionException {
  4. // ...
  5. }
  6. }

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

  1. this.trigger = newTrigger()
  2. .withIdentity(snapshotPolicyEntity.getName(), snapshotPolicyEntity.getService())
  3. .startAt(BackupUtils.now())
  4. .withSchedule(cronBuilder)
  5. .build();

初始化一个调度规则:

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

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

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

在Spring boot中如何使用Quartz?

在pom.xml添加依赖:

  1. <dependency>
  2. <groupId>org.quartz-scheduler</groupId>
  3. <artifactId>quartz</artifactId>
  4. <version>2.2.1</version>
  5. </dependency>

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

什么是cron表达式?

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

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

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

注意,从左到右依次是:

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

  1. 六个域:0 3 * * * ?
  2. 七个域:0 3 * * * ? *

比如:

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

  1. 0 10 8 1 * ?

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

  1. 0 10 8 * * 1

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

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

  1. 0 10 8 * * ?

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

  1. 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. (Angular Material)用Autocomplete打造带层级分类的DropDown

    效果如下图 代码实现 1.导入模块 import {MatAutocompleteModule} from '@angular/material/autocomplete'; @NgModule({  ...

  2. Angular开发环境构筑

    今天按照下面的顺序构筑了Angular的开发环境.很简单. -- 系统:win7, 64位 1.安装Note 从<https://nodejs.org/ja/>下载安装文件,安装. Not ...

  3. week07 codelab02 C72

    ss 我们要改一下backendserver的service 因为要写几个api还要做很多操作 我们单独写出来 然后由service来调用 import json import os import p ...

  4. 在类文件中创建 写入Json文件

    由于业务需要 今天写了一个方法能够定时更新Json文件 即定时从数据库中查询数据 然后转化为Json对象 如果有数据的话 删掉之前的Json文件 重新创建一个文件 然后写入Json对象 中间走了很多弯 ...

  5. Android studio下载慢解决,使用阿里云解决(转)

    转自:https://blog.csdn.net/kangweijian/article/details/79120849?%3E 使用开源中国的maven库 阿里云的(速度飞快):http://ma ...

  6. python中logging模块

    1. 日志的等级 DEBUG.INFO.NOTICE.WARNING.ERROR.CRITICAL.ALERT.EMERGENCY 级别 何时使用 DEBUG 详细信息,典型地调试问题时会感兴趣. 详 ...

  7. 使用kettle 的repository

    参考文献:原文:https://blog.csdn.net/m0_37979608/article/details/77096201 一.创建资源库的数据库 2.创建数据库资源库,如图 2.1.点击C ...

  8. 腾讯2019年暑期实习生招聘提前批在线笔试技术研究和数据分析方向t2(python)

    小Q有一叠纸牌,一共有n张,从上往下依次编号为1~n.现在小Q要进行以下重复操作:把位于顶端的牌扔掉,把新的顶端的牌放到这叠牌的底部.小Q会一直操作到只剩下一张牌为止,小Q想知道每次扔掉的牌的编号.[ ...

  9. mysql与cmd,中文乱码

    图中第一次select, 通过navicat插入表中的, 下面的这次select结果,是直接在命令行中插入的,中文就显示了两个问号...搞不懂咋回事..我是win10家庭版系统.....希望各位道友谨 ...

  10. 圆形图片 ImageView

    package com.example.m_evolution; import android.content.Context; import android.graphics.Bitmap; imp ...