Java使用quartz实现作业调度
在spring boot中使用quartz实现作业调度的功能,简单易用。
什么是Quartz?
Quartz是Java领域最著名的、功能丰富的、开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成——从小的单机应用到大的电子商务系统。 Quartz可以用来执行成百上千甚至数万的级别的、简单或者复杂的作业调度,一个Job可以执行任意的你所编程的任务。 Quartz调度包括许多企业级功能,如JTA事务和集群支持。
Quartz的主要角色有:
- Job:被调度的任务,重写其中execute方法,每次调度时会执行该方法;
- JobDetail:一个Job的具体化,可以这么看,JobDetail = Job + JobData
- Scheduler:调度器
- SchedulerFactory:调度工厂
- 各种ScheduleBuilder:CronScheduleBuilder(支持cron表达式的调度器)、CalendarIntervalScheduleBuilder(支持时间间隔的调度器)、SimpleScheduleBuilder(最简单的触发器,可以设置间隔,重复次数)
- 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实现作业调度的更多相关文章
- quartz开源作业调度框架的配置
quartz开源作业调度框架的job服务实现,Quartz是一个完全由java编写的开源作业调度框架,使用时候需要创建一个实现org.quartz.Job接口的java类,Job接口包含唯一的方法: ...
- Quartz.NET作业调度框架详解(转)
Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不牺牲 ...
- java 多线程——quartz 定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- Quartz.NET作业调度框架详解
Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html
- .net Quartz 服务 作业调度
.net项目中使用Quartz (1)在web.config中进行相关配置 <configSections> <section name="quartz" t ...
- .NET Core开源Quartz.Net作业调度框架实战演练
一.需求背景 人生苦短,我用.NET Core!作为一枚后端.NET开发人员,项目实践常遇到定时Job任务的工作,在Windows平台最容易想到的的思路Windows Service服务应用程序,而在 ...
- Quartz是一个完全由java编写的开源作业调度框架
http://www.quartz-scheduler.org/ 找个时间研究一下
- java任务调度quartz框架的小例子
quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...
- java框架---->quartz的使用(一)
Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制.今天我们就来学习一下它的使用,这里会分篇章对它进行介绍.只是希望能有个人,在我说没事的时候,知道我不 ...
随机推荐
- 接口性能测试(Jmeter)操作总结
以前常用SoapUI来做接口的性能测试,这次用的Jmeter,对需由客户端根据时间戳等登录参数生成随机token值和印签值来发请求的系统,非它莫属了.下面就这次测试的难点和操作注意问题展开总结. ** ...
- Linux网络编程学习(十二) ----- 结语
该书提前看完了,重点看了第四章和第六章,第七章以后只是大致浏览了一下,如果以后工作中涉及这一块再仔细研究一下,大概花了二十天的样子,主要了解了进程间的通信方式.socket编程以及五种I/O模式,看的 ...
- phxpaxos实现状态机CAS操作
看过了phxpaxos的实现,发现选主逻辑中非主也能够调用Propose.因此即使开启了选主功能,也可能会出现两个人同时Propose的场景.而Propose时,InstanceID只是作为输出而非输 ...
- my.conf配置信息
# mysql conf /etc/my.cnf# Created by http://www.wdlinux.cn# Last Updated 2010.06.01 [client]port = 3 ...
- nginx屏蔽ip配置
屏蔽单个IP的命令是 deny 192.168.201.1 封ip段192 deny 192.0.0.0/8 封ip段192.168 deny 192.168.0.0/16 封ip段192.168.2 ...
- DDB---查询与优化
摘要:分布式数据库(Distributed DB)是数据库中非常重要的一个部分,随着要处理的数据越来越多,分布式逐渐成为了一种策略.主要有:分布式操作系统,分布式程序设计语言,分布式文件系统,分布式数 ...
- py_innodb_page_info
python py_innodb_page_info.py -v /usr/local/var/mysql/ibdata1 mylib.py #encoding=utf-8 import os imp ...
- 电话号自动识别之bug解决汇总
今天测试一个defect: “联系我们”页显示的电话号码,在不同浏览器显示效果不统一,有些浏览器自动识别电话号码并强制添加了样式. 网络搜索发现,其它website 也有类似问题,例如:http:// ...
- [剑指Offer]60-n个骰子的点数
题意 输入骰子个数n,打印出所有骰子朝上的点的点数之和,及对应的概率. 题解 循环. n个骰子,点数之和在n~6n范围内.计算n个骰子扔出和为m的情况数,等于n-1个骰子扔出m-1,m-2...m-6 ...
- 作业四:个人项目-小学四则运算之JAVA版
作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186 代码所在的github远程仓库的地址:https://git ...