Quartz框架实现

2,766 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

1. Quartz简介

1.1 基本介绍

quartz是一种基于Java实现的任务调度框架,是Job Scheduling(作业调度)领域的项目,可以根据需要定义定时、延时、周期性执行任务。

1.2 官方文档

quartz官网地址

在官网中可以下载Quartz查看文档、以及quartz开源项目代码

将下载的quartz压缩文件解压后,quartz的文档、示例文件、相关jar包等都包含在其中了,十分方便学习。

image.png

2. 使用步骤

quartz的使用流程包含三个步骤:

  1. 定义任务Job
  2. 定义时间策略触发器Trigger
  3. 定义调度器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. 流程总结

  1. 定义任务类实现Job接口,并重写其中的execute()方法,其中定义任务内容
  2. 创建JobDetail类的对象,并绑定需要执行的任务类,进而获取任务内容Job
  3. 创建Trigger类的对象,设置SimpleTriggerCronTrigger类型的触发器对象,触发器负责在规定的时间内通知Scheduler去执行指定的Job
  4. Scheduler类型对象的创建,绑定JobDetail对象和Trigger对象,通过Trigger对象的通知,去执行JobDetail对象中相应Job任务。