Quartz学习总结
常规需求
spring自带支持定时器的任务实现。其可通过简单配置来实现定时任务。
1 2 3 4 5 6 7 8 9 10
| @Component @Configurable @EnableScheduling public class ScheduledTasks{
@Scheduled(cron = "0 */1 * * * * ") public void reportCurrentTimeByCorn(){ System.out.println("Cron北京时间:"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date())); } }
|
但是当我们的业务需求发生变动,比如使用springboot自带的定时器发布的定时任务,在运行了一段时间后,我们想要修改他的执行时间,但又不能关闭项目,只能动态修改。怎么办呢???
Quartz任务调度框架,就可以解决这种烦恼。让你随意的修改和添加定时任务。
复杂需求
当你在设计定时任务时,遇到了以上几种业务场景时,那么你就可以考虑使用quartz来解决,那么到底什么才是quartz呢?
完全由java开发的开源的任务日程管理系统,即在一个预先确定的时间到达时,负责执行或者通知其他软件组件的系统
springboot集成quartz小例子
我们可以先来看一个springboot中通过quartz实现定时任务的小栗子。
maven文件
注:springboot2.0以后就已经提供了quartz的依赖支持:spring-boot-starter-quartz,此处我们还是使用官方提供的依赖来举例。
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.3.0</version> </dependency>
|
创建一个Job
即定义一个任务类,实现Job接口,告诉quartz当任务任务的执行具体内容,创建SimpleJob类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package com.example.quartz.Job;
import org.quartz.*; import java.util.Date;
public class SimpleJob implements Job { public SimpleJob(){
} @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("开始执行简单任务"+new Date()); } }
|
接着创建一个最基础的定时任务套路
QuartzDemo类,简单概括为5步,注意看代码注释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| package com.example.quartz.demo;
import com.example.quartz.Job.SimpleJob; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
public class QuartzDemo { public static void main(String[] args) {
try { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); JobDetail job = JobBuilder.newJob(SimpleJob.class) .withIdentity("job1", "group1") .build(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(6) .withRepeatCount(10)) .build(); scheduler.scheduleJob(job, trigger);
} catch (SchedulerException e) { e.printStackTrace(); }
} }
|
运行QuartzDemo,观察控制台,你会发现一个简单的定时任务已经跑起来了!

Quartz中的要素:scheduler任务调度、Job任务、JobDetail任务详情、Trigger触发器
- Job:任务的逻辑。通过实现Job接口,定义任务的执行内容,简单说就是定义“做什么?”
- JobDetail:任务的定义,通过newJob()绑定Job类。描述自定义的Job实现类,比如任务的名字。另一方面也是为了防止并发问题,简单说就是定义“谁要做?”
- Trigger:定时器,配置定时器的名称,配置定时器的类型触发方式等,简单说就是定义“什么时候做?”
- Scheduler:调度器。接受一组JobDetail+Trigger即可安排一个任务,所有的调度由他控制
quartz的调度思路:
- 创建一个具体的任务(Job)
- 配置任务的触发时间等(Trigger)
- 配置任务的具体内容(JobDetail)
- 调度器Scheduled根据JobDetail+Trigger安排此任务去执行
用一幅图简单形容一下quartz的原理

触发器种类
刚才的小例子中的触发器是以秒为时间间隔来定时调度,Quartz中有多种不同类型的触发器:
- SimpleTrigger:用来存储方法只需用执行一次,或者时给定触发事件并重复执行N次并且每次执行延迟一定时间的任务。
- CronTirgger:按照日历出发,例如每周五,每月十号十点钟,适合于更复杂的任务
- DateIntervalTrigger:指定每天的某个时间段内,以一定的时间间隔执行任务。并且它可以支持指定星期。
- CalendarIntervalTrigger:类似于SimpleTrigger,支持的间隔单位有秒,分钟,小时,天,月,年,星期。
quartz持久化方式
Quartz提供两种基本作业存储类型
- 第一种类型叫做RAMJobStore
- 最佳的性能,因为内存中数据访问最快
不足之处是缺乏数据的持久性,当程序路途停止或系统崩溃时,所有运行的信息都会丢失
- 第二种类型叫做JDBC作业存储
- 通过调整其quartz.properties属性文件,持久化任务调度信息
使用数据库保存任务调度信息后,即使系统崩溃后重新启动,任务的调度信息将得到恢复
quartz中其他知识点
通过阅读quartz的源码,以及官方的文档发现,quartz的开发者很喜欢用建造者模式。其实这种方式可以使复杂的对象更加清晰,阅读和使用中也更加清楚明了。
本文其实只是quartz的基础知识的学习和使用入门,springboot2.0之后也对quartz进行了封装,关于quartz更加优雅的使用方式和技巧也会在后面的博文中记录。