小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
1. Quartz简介
1.1 基本介绍
quartz是一种基于Java实现的任务调度框架,是Job Scheduling(作业调度)领域的项目,可以根据需要定义定时、延时、周期性执行任务。
1.2 官方文档
在官网中可以下载Quartz、查看文档、以及quartz开源项目代码 。
将下载的quartz压缩文件解压后,quartz的文档、示例文件、相关jar包等都包含在其中了,十分方便学习。
2. 使用步骤
quartz的使用流程包含三个步骤:
- 定义任务Job
- 定义时间策略触发器Trigger
- 定义调度器Scheduler,实现定时执行任务
2.1 引入依赖
quartz相关依赖信息
<!--quartz核心包-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<!--工具-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.2</version>
</dependency>
<!--SpringBoot下quartz依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.3 定义任务类
quartz
框架中定义任务类需要实现Job
接口,Job
来源于quartz
依赖中的org.quartz.Job
包,并且需要重写Job接口中的execute(...)
方法,方法内为需要执行的任务内容。
public class DoTaskByQuartz implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任务执行,当前时间:" + System.currentTimeMillis());
}
}
任务类定义完成后,实际使用时需要将任务类作为参数传递生成JobDetail对象进行使用
//设置任务对象名称,并创建
JobDetail jobDetail = JobBuilder.newJob(DoTaskByQuartz.class)
.withIdentity("jobName")
.build();
2.3 定义时间策略(触发器)
quartz框架中使用Trigger对象作为任务触发器,配置定时任务的时间策略时通过创建Trigger对象进行配置。
Trigger对象有两种创建方式:
- SimpleTrigger,使用SimpleScheduleBuilder创建,设置周期时间
- CronTrigger,使用CronScheduleBuilder创建,通过cron表达式设置时间规则
//①设置触发器名称信息;②设置触发器立即生效;③设置任务触发周期;④创建Trigger对象
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("triggerName")
.startNow() .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
.build();
2.4 定义任务调度器
调度器定义时使用工厂类来创建默认的调度器对象,并完成定时任务和触发器的装配。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
2.5 完整使用流程
//main启动类,任务类已经定义
public static void main(String[] args) throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(DoTaskByQuartz.class)
.withIdentity("jobName")
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("triggerName")
.startNow()
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2))
.build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
}
3. 流程总结
- 定义任务类实现
Job
接口,并重写其中的execute()
方法,其中定义任务内容 - 创建
JobDetail
类的对象,并绑定需要执行的任务类,进而获取任务内容Job
- 创建
Trigger
类的对象,设置SimpleTrigger
或CronTrigger
类型的触发器对象,触发器负责在规定的时间内通知Scheduler
去执行指定的Job
Scheduler
类型对象的创建,绑定JobDetail
对象和Trigger
对象,通过Trigger
对象的通知,去执行JobDetail
对象中相应Job
任务。