一、概念
1.1简介
Quzrtz是OpenSymphony开源组织在Job scheduling领域的开源项目
特点:Quartz具有丰富特性的"任务调度库",能够集成于任何的Java应用,小到独立的应用,大到电子商业系统。quartz能够创建亦简单亦复杂的调度,执行上万的任务,任务Job被定义为标准的Java组件,支持JTA事务、集群。
1.2核心概念
- 任务job
😄Job就是你想要的任务类,每一个Job必须实现org.quartz.job接口,且实现execute()方法。 - 触发器Trigger
😄Trjgger是执行任务的触发器,分为SimpleTrigger和CronTrigger - 调度器Scheduler
😄它将任务job及触发器Trigger整合起来,负责基于Trigger设定的时间来执行job。
1.3Quartz的体系结构
1.4Quartz的常用API
二、SpringBoot集成Quartz
2.1Demo
pom.xml
<dependencies>
<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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
测试类
package com.kiki.quartz.job;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author kiki
* @date 2023/7/2
* @description
*/
@Slf4j
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//输出当前时间的任务
Date date = new Date();
//业务
log.info("正在进行数据库的备份工作,备份数据库的时间是:"+ SimpleDateFormat.getDateInstance().format(new Date()));
System.out.println("正在进行数据库的备份工作,备份数据库的时间是:"+ DateUtil.now());
}
}
package com.kiki.quartz.domain;
import com.kiki.quartz.job.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author kiki
* @date 2023/7/2
* @description
*/
public class HelloSchedulerDemo {
public static void main(String[] args) throws Exception{
//1.调度器Scheduler,从工厂中获取调度的实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//2.任务实例JobDetail,加载任务类,与HelloJob完成绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("job1","group1")//任务组
.build();
//3.触发器Trigger
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1","group1")//触发器组
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))
.build();
//关联任务和触发器,保证按照触发器定义的条件执行任务
scheduler.scheduleJob(jobDetail,trigger);
//启动
scheduler.start();
}
}
2.2Job和JobDetail
- Job:工作任务调度的接口,任务类需要实现该接口。该接口中定义了execute方法,类似JDK中提供的TimerTask类的run方法,在里边编写业务逻辑。
- Job实例在Quartz中的生命周期:每次调度执行Job时,它在调用execute方法前会创建一个新的job实例,当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。
- JobDetail:JobDetail为Job实例提供了许多设置属性,以及JobDetaMap成员变量属性,用来存储特定Job实例的状态信息,调度器 需要借助JobDetail对象来添加Job实例。
- JobDetail重要属性:name、group、jobClass、jobDataMap
2.3JobExecutionContext
- 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的execute()方法;
- Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。
2.4JobDataMap
(1)使用Map获取
- 在进行任务调度时,JobDataMap存储在JobExecutionContext中,非常方便获取
- JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时这些参数对象会传递它。
(2)Job实现类中添加setter方法对应JobDataMap的键值,Quartz框架默认的JobFactory实现类在初始化job实例对象时会自动调用这些setter方法。
😄注意:如果遇到 同名的key,Trigger中的usingJobData(“message”,“simple触发器”)会覆盖JobDetail中的.usingJobData(“message”,“打印日志”)。
2.5有状态的Job和无状态的Job
@PersistJobDataAfterExecution注解的使用(多次调用Job的时候,会对Job进行持久化,即会保存数据的信息)
有状态的Job可以理解为多次Job调用期间可以持有一些状态信息,这些状态信息存储在JobDataMap中,而默认的无状态Job每次调用时会创建一个新的JobDataMap。
三、Trigger触发器
Quartz有一些不同的触发器类型,不过,用得最多的是SimpleTrigger和CronTrigger
(1)JobKey
- 表示Job实例的标识,触发器被触发时,该指定的job实例会被实例化。
(2)startTime
- 表示触发器的时间表,第一次开始被触发的时间,它是数据类型是java.util.Date
(3)endTime
- 指定触发器终止被触发的时间,它的数据类型是java.util.Date