Quartz任务调度笔记

一、概念

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的体系结构

Quartz任务调度笔记_第1张图片

1.4Quartz的常用API

Quartz任务调度笔记_第2张图片

二、SpringBoot集成Quartz

2.1Demo

pom.xml

	<dependencies>
        <dependency>
            <groupId>org.quartz-schedulergroupId>
            <artifactId>quartzartifactId>
            <version>2.3.0version>
        dependency>
        <dependency>
            <groupId>org.quartz-schedulergroupId>
            <artifactId>quartz-jobsartifactId>
            <version>2.3.0version>
        dependency>
        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-log4j12artifactId>
        dependency>

        <dependency>
            <groupId>log4jgroupId>
            <artifactId>log4jartifactId>
            <version>1.2.17version>
        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任务调度笔记_第3张图片
Quartz有一些不同的触发器类型,不过,用得最多的是SimpleTrigger和CronTrigger
(1)JobKey

  • 表示Job实例的标识,触发器被触发时,该指定的job实例会被实例化。

(2)startTime

  • 表示触发器的时间表,第一次开始被触发的时间,它是数据类型是java.util.Date

(3)endTime

  • 指定触发器终止被触发的时间,它的数据类型是java.util.Date
    测试类
package com.kiki.quartz.domain;

import com.kiki.quartz.job.HelloJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

/**
 * @author kiki
 * @date 2023/7/2
 * @description
 */
public class HelloSchedulerDemoTrigger {
    public static void main(String[] args) throws Exception{
        //1.调度器Scheduler,从工厂中获取调度的实例
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        //设置任务的开始结束时间
        Date startDate = new Date();
        startDate.setTime(startDate.getTime()+3000);
        Date endDate = new Date();
        endDate.setTime(endDate.getTime()+10000);


        //2.任务实例JobDetail,加载任务类,与HelloJob完成绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("job1","group1")//任务组
                .build();
        //3.触发器Trigger
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1","group1")//触发器组
                .startAt(startDate)
                .endAt(endDate)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5))//五秒触发一次
                .build();

        //关联任务和触发器,保证按照触发器定义的条件执行任务
        scheduler.scheduleJob(jobDetail,trigger);
        //启动
        scheduler.start();
    }
}

3.1SimpleTrigger触发器
SimpleTrigger对于设置和使用是最简单的一种QuartzTrigger。它是为那种需要在特定的日期/时间启动,且以一个可能的间隔时间重复执行n次的Job所设计的。
案例一:
表示在 一定的时间内,执行一次作业任务。

你可能感兴趣的:(spring,boot,定时任务,Job,Quartz)