Quartz是一个完全由java编写的开源作业调度框架。
通过触发器设置作业定时运行规则、控制作业的运行时间。
Quartz定时器的作用很多,比如定时发送信息、定时器生成报表。
2 核心组件
2.1 Quartz框架的核心对象
-
Scheduler – 核心调度器
-
Job – 任务
-
JobDetail – 任务描述
-
Trigger -- 触发器
Job是一个接口,借口中只有一个execute()方法,具体的任务类需要实现该接口的该方法。
public interface Job {
void execute(JobExecutionContext context)
throws JobExecutionException;
}
2.2 对象之间的关系
3.1 建立一个Maven项目
3.2 引入quartz依赖
使用quartz,我们仅仅需要在maven的pom文件中添加依赖即可。我使用的是现在最新的一个版本2.3.0。
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
4 编写第一个Quartz任务案例
这个任务主要是每2秒打印一次HelloQuartz。
先实现一下这个基本的Quartz的任务再来介绍一下Quartz的3个重要组成,JobDetail,Trigger,Scheduler。
4.1 创建一个类HelloJob.java
这个类是我们具体要实现的任务(打印Hello Quartz)
package com.example;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Auther: wuyilong
* @Date: 2019/3/20 09:27
* @Description: 打印Hello Quartz
*/
public class HelloJob implements Job {
4.2 创建HelloScheduler.java,这个是具体触发我们的任务
创建HelleScheduler的步骤:
-
创建调度工厂(); //工厂模式
-
根据工厂取得调度器实例(); //工厂模式
-
Builder模式构建子组件<Job,Trigger> // builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
-
通过调度器组装子组件 调度器.组装<子组件1,子组件2...> //工厂模式
-
调度器.start(); //工厂模式
public class HelloScheduler {
public static void main(String[] args) throws SchedulerException {
//创建一个jobDetail的实例,将该实例与HelloJob Class绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob").build();
//创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行
SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
//创建schedule实例
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
}
}
5 cron表达式编写规则
5.1 Quartz Cron 表达式支持7个域 ,分别是秒/分/时/日/月/周/年。
名称 | 是否必须 | 允许值 | 特殊字符 |
---|---|---|---|
秒 | 是 | 0-59 | , - * / |
分 | 是 | 0-59 | , - * / |
时 | 是 | 0-23 | , - * / |
日 | 是 | 1-31 | , - * ? / L W C |
月 | 是 | 1-12 或 JAN-DEC | , - * / |
周 | 是 | 1-7 或 SUN-SAT | , - * ? / L C # |
年 | 否 | 空 或 1970-2099 | , - * / |
5.2 官方的一些案例
表示式 | 说明 |
---|---|
0 0 12 * * ? | 每天12点运行 |
0 15 10 ? * * | 每天10:15运行 |
0 15 10 * * ? | 每天10:15运行 |
0 15 10 * * ? * | 每天10:15运行 |
0 15 10 * * ? 2008 | 在2008年的每天10:15运行 |
0 * 14 * * ? | 每天14点到15点之间每分钟运行一次,开始于14:00,结束于14:59。 |
0 0/5 14 * * ? | 每天14点到15点每5分钟运行一次,开始于14:00,结束于14:55。 |
0 0/5 14,18 * * ? | 每天14点到15点每5分钟运行一次,此外每天18点到19点每5钟也运行一次。 |
0 0-5 14 * * ? | 每天14:00点到14:05,每分钟运行一次。 |
0 10,44 14 ? 3 WED | 3月每周三的14:10分到14:44,每分钟运行一次。 |
0 15 10 ? * MON-FRI | 每周一,二,三,四,五的10:15分运行。 |
0 15 10 15 * ? | 每月15日10:15分运行。 |
0 15 10 L * ? | 每月最后一天10:15分运行。 |
0 15 10 ? * 6L | 每月最后一个星期五10:15分运行。 |
0 15 10 ? * 6L 2007-2009 | 在2007,2008,2009年每个月的最后一个星期五的10:15分运行。 |
0 15 10 ? * 6#3 | 每月第三个星期五的10:15分运行。 |
6 SpringBoot2集成Quartz
6.1 Maven文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
6.2 编写任务类
package com.example.task;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* @Auther: wuyilong
* @Date: 2019/3/20 10:32
* @Description:
*/
public class MjtTask extends QuartzJobBean {
6.3 编写配置类
package com.example.config;
import com.example.task.MjtTask;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Auther: wuyilong
* @Date: 2019/3/20 10:33
* @Description:
*/
6.4 运行结果