定时任务框架Quartz

阅读 114

2022-02-11

目录

一、Quartzh介绍

        1、Quartz的定义:

        2、Quartz完成定时任务的原理:

二、cron表达式

          1、cron表达式定义

          2、cron表达式规范 

三、spring自带调度器

四、Quartz内存版集成基本使用

        1、关于Quartz内存版集成的步骤

                 1、先到启动类中写好集成的步骤

                 2、再写一个任务类

                 3、优化Quartz内存方式

                 4、测试结果​

五、关于Job任务和Trigger触发器的介绍

        1、Job任务

                  1、定义

                  2、实例化的过程

        2、Trigger触发器

                 2.1介绍

                 2.2触发器常用属性

                 2.3触发器的优先级 

                 2.4常用触发器 在第四大点已经讲解到


一、Quartzh介绍

        1、Quartz的定义:

        2、Quartz完成定时任务的原理:

        1、首先我们需要定义实现一个定时功能的接口,称之为Task(或Job),如定时发送邮件的task(Job),重启机器的task(Job),优惠券到期发送短信提醒的task(Job),实现接口如下:

        2、有了任务之后,还需要一个能够实现触发任务去执行的触发器,触发器Trigger最基本的功能是指定Job的执行时间,执行间隔,运行次数等。 

        3、有了Job和Trigger后,怎么样将两者结合起来呢?即怎样指定Trigger去执行指定的Job呢?这时需要一个Schedule,来负责这个功能的实现。 

由以上原理可得Quartz可以由以下三部分组成

  • 调度器:Scheduler
  • 任务:JobDetail
  • 触发器:Trigger,包括SimpleTrigger(简单触发器)和CronTrigger

二、cron表达式

          1、cron表达式定义

          2、cron表达式规范 

每个域都可以用数字表示,还可以出现如下特殊字符 

注意:天数和星期不能同时出现!!!

三、spring自带调度器

           1、创建一个简单项目(不要任何工具注入),将开启调度器注解注入启动类中

           2、写一个任务类Task

package com.zj.code;


import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
@Slf4j
public class Task {
    @Scheduled(fixedRate = 2000)
    //上⼀次开始执⾏时间点之后2秒再执⾏
    public void task(){
        log.warn("现在时间:" + LocalDateTime.now());
    }
}

关于调度器的几个注解:

           3、进行测试

四、Quartz内存版集成基本使用

        1、关于Quartz内存版集成的步骤

                 1、先到启动类中写好集成的步骤

package com.zj.code;

import org.junit.jupiter.api.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;

import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;

@SpringBootTest
class Quartz01ApplicationTests {

    @Test
    void contextLoads() throws Exception {
        //1、先实例化调度器工厂
        SchedulerFactory factory = new StdSchedulerFactory();
        //2、得到调度器
        Scheduler scheduler = factory.getScheduler();
        //3、创建任务
        JobDetail jobDetail = newJob(MyJob.class)
                .withDescription("开年大扫除")
                .withIdentity("a", "b")
                .usingJobData("name", "王阿姨")
                .build();

        //4.创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .withDescription("大扫除触发器")
                .withIdentity("b", "c")
                .startAt(new Date())
//                .withSchedule(
//                        simpleSchedule()
//                                .withIntervalInSeconds(1)
//                                .withRepeatCount(10) //SimpleTrigger.REPEAT_INDEFINITELY
//                )
//                .withSchedule(
//                        CronScheduleBuilder.cronSchedule("* * * * * ?")
//                )
                .build();
        //5.将触发器和任务绑定到调度器中去
        scheduler.scheduleJob(jobDetail, trigger);
        //6.启动调度器
        scheduler.start();
    }

}

                 2、再写一个任务类

MyJob:
package com.zj.code;

import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;


/**
 * @author T440s
 */
@Slf4j
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        Object name = context.getJobDetail().getJobDataMap().get("name");//先得到任务,之后就得到map中的名字
        log.warn(name + "搞卫生");
    }
}

                 3、优化Quartz内存方式

触发器分为常用触发器和基于cron表达式的触发器

常用触发器:

Trigger trigger = TriggerBuilder.newTrigger()       
.withDescription("")       
.withIdentity("clean", "clean1")       
.startAt(new Date())       
.withSchedule(            
        simpleSchedule()               
        .withIntervalInSeconds(10)                
        .withRepeatCount(10) //SimpleTrigger.REPEAT_INDEFINITELY       
)       
.build();

基于cron表达式的触发器

Trigger trigger = TriggerBuilder.newTrigger()       
     .withIdentity("test", "test")       
     .withDescription("测试的触发器")       
     .withSchedule(
           CronScheduleBuilder.cronSchedule("2 * * * * *")
                  )       
     .build();

                 4、测试结果

五、关于Job任务和Trigger触发器的介绍

        1、Job任务

                  1、定义

package com.zj.code;

import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;


/**
 * @author T440s
 */
@Slf4j
public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        Object name = context.getJobDetail().getJobDataMap().get("name");//先得到任务,之后就得到map中的名字
        log.warn(name + "搞卫生");
    }
}

                  2、实例化的过程

JobDetail jobDetail = newJob(MyJob.class)               
.withDescription("开年大扫除")               
.withIdentity("大扫除", "厕所")               
.usingJobData("name", "王阿姨")               
.build();

        2、Trigger触发器

                 2.1介绍

                 2.2触发器常用属性

 Trigger trigger = TriggerBuilder.newTrigger()               
.withDescription("大扫除触发器")               
.withIdentity("大扫除", "厕所")               
.startAt(new Date())               
.build();

                 2.3触发器的优先级 

                 2.4常用触发器 在第四大点已经讲解到

今天的知识就分享到这了,希望对你有帮助! 

精彩评论(0)

0 0 举报