目录

1.Quartz介绍

2. Quartz的触发器

2.1五种类型的Trigger(定时器)

3.储存方式

3.2 cron表达式

 4.Quartz创建定时任务

4.1导入Quartz依赖

4.2job任务类 

4.3 具体业务实现

5 Quartz 核心类详解

5.1 Scheduler 调度器

5.2 Job 定时任务

5.3 Trigger 触发器


1.Quartz介绍

任务调度框架“Quartz”是OpenSymphony开源组织在Job scheduling领域又一个开源项目,是完全由java开发的一个开源的任务日程管理系统,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

简单来说就是实现“计划(或定时)任务”的系统,例如:订单下单后未付款,15分钟后自动撤消订单,并自动解锁锁定的商品

2. Quartz的触发器

触发器用来告诉调度程序作业什么时候触发。框架提供了5种触发器类型,但两个最常用的SimpleTrigger和CronTrigger。

2.1五种类型的Trigger(定时器)

SimpleTrigger,CronTirgger,DateIntervalTrigger,NthIncludedDayTrigger和Calendar类( org.quartz.Calendar)。

场景:

SimpleTrigger:执行N次,重复N次

CronTrigger:几秒 几分 几时 哪日 哪月 哪周 哪年,执行

3.储存方式

 RAMJobStore(内存作业存储类型)和JDBCJobStore(数据库作业存储类型),两种方式对比如下:

   3.1 RAMJobStore  不要外部数据库,配置容易,运行速度快    因为调度程序信息是存储在被分配给JVM的内存里面, 所以,当应用程序停止运行时,所有调度信息将被丢失。另外因为存储到JVM内存里面,所以可以存储多少个Job和Trigger将会受到限制

   3.2 JDBCJobStore  支持集群,因为所有的任务信息都会保存    运行速度的快慢取决与连接数据库的快慢到数据库中,可以控制事物,还有就是如果应用服务器关闭或者重启,任务信息都不会丢失,并且可以恢复因服务器关闭或者重启而导致执行失败的任务   

3.2 cron表达式

 4.Quartz创建定时任务

4.1导入Quartz依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

4.2job任务类 

package com.wyy.quartz.Text;

import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@Slf4j
public class MyJob implements Job {


    @Override
    public void execute(JobExecutionContext Context) throws JobExecutionException {
        Object name = Context.getJobDetail().getJobDataMap().get("name");
        log.warn(name+"在搞卫生");
    }
}

4.3 具体业务实现

package com.wyy.quartz.Text;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.stereotype.Component;

import java.util.Date;

import static org.quartz.JobBuilder.newJob;

@Component
public class scheduler {

    public void getScheduler() {
        //创建调度工厂类实例StdSchedulerFactory
        StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
        try {
            //创建调度器实例Scheduler
            Scheduler scheduler = stdSchedulerFactory.getScheduler();
            //创建任务详情JobDetail
            JobDetail jobDetail = newJob(MyJob.class)
                    .withIdentity("detail01", "group01")  //定义任务主键 组成唯一标识
                    .withDescription("this is a jobDetail")//描述
                    .usingJobData("name", "张三")//向具体执行的作业类传值方式一
                    .build();//构建任务
            //向具体执行的作业类传值方式二
//            JobDataMap jobDataMap = jobDetail.getJobDataMap();
//            jobDataMap.put("name", "张三");
            //创建触发器
            Trigger trigger = (Trigger) TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "group01")   //组成唯一标识
                    .startAt(new Date())             //开始时间
                    .withDescription("this is a trigger")
                    //简单触发器
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                      //每隔两秒重复执行3次
                      .withIntervalInSeconds(2).withRepeatCount(3))
                    //表达式调度器(在线生成定时任务表达式:http://cron.qqe2.com/)
                    //每5秒执行一次作业类逻辑代码
                    //.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ? "))
                    .build();
            //注入作业类以及触发器到调度器中
            scheduler.scheduleJob(jobDetail, trigger);
            //启动调度器
            scheduler.start();

        } catch (SchedulerException e) {
            e.printStackTrace();
        }

    }
}

 以上业务代码中主要涉及到 Scheduler 调度器、Job 定时任务 、Trigger 触发器 三个类(quartz 核心类)

5 Quartz 核心类详解

5.1 Scheduler 调度器

用于与调度程序交互的主程序接口. Scheduler维护了一个JobDetails和Triggers 的注册表。
一旦在Scheduler注册过了,当定时任务触发时间一到,调度程序就会负责执行预先定义的Job 调度程序创建之后,处于“待机”状态,必须调用 scheduler 的 start() 方法启用调度程序
可以使用 shutdown() 方法关闭调度程序,使用 isShutdown() 方法判断该调度程序是否已经处于关闭状态。通过 Scheduler.scheduleJob(…) 方法将任务纳入调度程序中,当任务触发时间到了的时候,该任务将被执行 。

5.2 Job 定时任务

通过任务类生成任务详情(一个任务类可以有多个任务详情),向任务类传递参数。

5.3 Trigger 触发器

触发器使用 TriggerBuilder 来实例化,有一个 TriggerKey 关联,在一个 Scheduler 中必须是唯一的。多个触发器可以指向同一个工作,但一个触发器只能指向一个工作。触发器可以传送数据给 job,通过将数据放进触发器的 JobDataMap。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐