分布式任务调度QuartZ框架使用(通过注解使用quartz)

news2024/11/24 8:03:57

1、Quartz概述

quartz官网文档:http://www.quartz-scheduler.org/

quartz是一个定时调度的框架,属于比较早期的产品,现在市面上流行的xxl-Job,elastic-Job分布式调度框架都是基于该产品。虽然很多人说quartz的使用不是很方便,api不人性化。但是学习quartz还是有助于我们理解其他的框架。并且市面上依旧有大量的项目正在使用quartz。

Quartz能够与spring完美整合,使用Quartz可以开发多个定时任务,每个任务都可以单独指定触发的时间频率。例如每周日下午五点执行一次。

1.1、quartz使用场景及作用

1、运行定时任务、发送定时消息:如每天早上七点发送消息、定时生成报表、自动结账、自动更新静态数据、定时的数据备份。

2、定义周期任务:本质还是定时任务,在定时的基础上设置成周期任务。

3、分布式和集群能力:Quartz支持集群和分布式环境,

4、任务优先级和调度:Quartz允许你设置任务的优先级,并且可以基于优先级调度任务。这意味着,如果两个任务同时可用,那么优先级较高的任务会优先执行。

5、任务失败重试:Quartz可以配置任务失败时候的重试策略。

6、任务依赖关系:Quartz允许任务之间建立依赖关系,这使得任务调度更加灵活和可配置。

1.2、QuartZ的四大核心组件及关联

从图中可以看出QuartZ主要有四大核心:

1、调度器(Scheduler):任务运行的容器或地点。

2、任务(JobDetail):定时任务本身的消息,如任务的名称,组等。

3、触发器(Trigger):任务触发规则,例如:每小时触发一次等。

4、任务:Job(任务的具体执行内容)

1Scheduler详解:调度器,Quartz独立的运行容器。从图中可以看出,触发器(Trigger)和任务(JobDetail)都会被注册到Scheduler中。一个job可以被多个jobDetail装载,一个jobDetail可以被多个trigger来配置规则,但一个trigger只能装载一个jobDetail。当Trigger被触发时,对应的job就会执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。任务:JobDetail。

2、触发器详解:Trigger,描述触发job执行的时间规则,实现类包括

SimpleTrigger简单触发器:实现固定时刻或固定间隔

CronTrigger触发器:基于Cron表达式触发器、

CalendarIntervalTrigger基于日历的触发器:如每个月的1 号15号执行。

DailyTimeIntervalTrigger基于日期的触发器,每天的固定时间

 其中CronTrigger可以通过cron表示式定义出复杂的调度方案,表达式使用地址如下:

   在线Cron表达式生成器

3JobDetail详解:Trigger被触发时,Quartz创建一个Job实例,对应的job就会执行。JobDetail就是用来描述Job实现类以及相关静态信息,比如任务在scheduler中的组名等信息。

4Job详解:需要实现QuartzJobBean类重写executeInternal方法,在这个方法中创建具体的任务细节。

2、QuartZ快速上手案例

2.1、工程结构

2.2、创建springboot工程,引入quartz包

核心包:spring-boot-starter-quartz

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>quartzdemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>quartzdemo1</name>
    <description>quartzdemo1</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder-jammy-base:latest</builder>
                    </image>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.3、创建Quartz配置类

在配置类中配置触发器(Trigger)和任务(JobDetail)

但是此时的trigger没有设置时间规则,只会触发一次。

@Configuration
public class QuartzJobConfig {

    @Bean
    public JobDetail jobDetail(){
       JobDetail detail= JobBuilder.newJob(MyQuartzJob.class)
            .withIdentity("job1","group1")
            .storeDurably()//设置Job持久化
            //设置job数据
            .usingJobData("username","xiaochun")
            .usingJobData("useraddr","安徽合肥")
            .build();
      return detail;
    }

    //创建触发器,触发实例
    @Bean
    public Trigger trigger(){
        Trigger trigger= TriggerBuilder.newTrigger()
                .forJob(jobDetail())
                .withIdentity("trigger1","group1")
                .startNow()
                .build();
        return trigger;

    }
}

2.4、创建JoB具体任务

@Slf4j
public class MyQuartzJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        //执行的具体内容
        log.info("=========quartz具体内容============");
    }
}

2.5、启动工程后效果

如下图项目启动的时候,任务启动,但是只会启动一次。

2.6、通过CronScheduleBuilder配置时间规则

在上面案例的基础上配置时间规则,如每5秒执行一次。

表达式的使用可以使用官网中直接生成。

在线Cron表达式生成器:在线Cron表达式生成器

常用案例如下:

常用cron表达式例子

  (1)0/2 * * * * ?   表示每2秒 执行任务

  (1)0 0/2 * * * ?    表示每2分钟 执行任务

  (1)0 0 2 1 * ?   表示在每月的1日的凌晨2点调整任务

  (2)0 15 10 ? * MON-FRI   表示周一到周五每天上午10:15执行作业

  (3)0 15 10 ? 6L 2002-2006   表示2002-2006年的每个月的最后一个星期五上午10:15执行作

  (4)0 0 10,14,16 * * ?   每天上午10点,下午2点,4点 

  (5)0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时 

  (6)0 0 12 ? * WED    表示每个星期三中午12点 

  (7)0 0 12 * * ?   每天中午12点触发 

  (8)0 15 10 ? * *    每天上午10:15触发 

  (9)0 15 10 * * ?     每天上午10:15触发 

  (10)0 15 10 * * ?    每天上午10:15触发 

  (11)0 15 10 * * ? 2005    2005年的每天上午10:15触发 

  (12)0 * 14 * * ?     在每天下午2点到下午2:59期间的每1分钟触发 

  (13)0 0/5 14 * * ?    在每天下午2点到下午2:55期间的每5分钟触发 

  (14)0 0/5 14,18 * * ?     在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 

  (15)0 0-5 14 * * ?    在每天下午2点到下午2:05期间的每1分钟触发 

  (16)0 10,44 14 ? 3 WED    每年三月的星期三的下午2:10和2:44触发 

  (17)0 15 10 ? * MON-FRI    周一至周五的上午10:15触发 

  (18)0 15 10 15 * ?    每月15日上午10:15触发 

  (19)0 15 10 L * ?    每月最后一日的上午10:15触发 

  (20)0 15 10 ? * 6L    每月的最后一个星期五上午10:15触发 

  (21)0 15 10 ? * 6L 2002-2005   2002年至2005年的每月的最后一个星期五上午10:15触发 

  (22)0 15 10 ? * 6#3   每月的第三个星期五上午10:15触发

@Configuration
public class QuartzJobConfig {
    //每隔5秒执行一次
    CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
    @Bean
    public JobDetail jobDetail(){
        JobDetail detail= JobBuilder.newJob(MyQuartzJob.class)
                .withIdentity("job1","group1")
                .storeDurably()//设置Job持久化
                //设置job数据
                .usingJobData("data","自定义数据")
                .build();
        return detail;
    }

    //创建触发器,触发实例
    @Bean
    public Trigger trigger(){
        Trigger trigger= TriggerBuilder.newTrigger()
                //关联jobDetail
                .forJob(jobDetail())
                .withIdentity("trigger1","group1")
                .withSchedule(cronScheduleBuilder)
                .startNow()
                .build();
        return trigger;
    }
}

输出结果

从结果可以看出:任务每隔五秒执行一次。

2.7、通过SimpleScheduleBuilder配置时间规则

如果时间规则没有name复杂,可以使用SimpleScheduleBuilder配置简单的时间规则。

withIntervalInSeconds(3):时间规则为秒,还有小时,分钟,毫秒单位等。

@Configuration
public class QuartzJobConfig {
    @Bean
    public JobDetail jobDetail(){
        JobDetail detail= JobBuilder.newJob(MyQuartzJob.class)
                .withIdentity("job1","group1")
                .storeDurably()//设置Job持久化
                //设置job数据
                .usingJobData("username","xiaochun")
                .usingJobData("useraddr","安徽合肥")
                .build();
        return detail;
    }

    //创建触发器,触发实例
    @Bean
    public Trigger trigger(){
        Trigger trigger= TriggerBuilder.newTrigger()
                //关联jobDetail
                .forJob(jobDetail())
                .withIdentity("trigger1","group1")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        //执行间隔
                        .withIntervalInSeconds(3)
                        //执行次数
                        .repeatForever())
                .startNow()
                .build();
        return trigger;
    }
}

输出结果

2.8、在Job中获取JobDetail中定义的信息

也就是获取JobDetail中通过//设置job数据.usingJobData("username","xiaochun")设置的参数,

通过context.getJobDetail().getJobDataMap().get("username")可以获取到。

@Slf4j
public class MyQuartzJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        //执行的具体内容
        log.info("=========quartz具体内容============");
        System.out.println(context.getJobInstance());
        System.out.println(context.getJobDetail().getJobDataMap().get("username"));
    }
}

输出结果:

2.9、上面操作源码下载

源码下载:https://download.csdn.net/download/tangshiyilang/88632313

3、在springboot中通过注解使用quartz

@Scheduled   任务调度执行 注解用该注解修饰方法

@EnableScheduling  开启任务调度  需要配置在启动类上 

3.1、创建springboot工程配置包

核心类:spring-boot-starter-quartz

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.txc</groupId>
    <artifactId>quartzannotationdemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>quartzannotationdemo1</name>
    <description>quartzannotationdemo1</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

3.2、在启动类上开启任务调度

@EnableScheduling:开启任务调度

@SpringBootApplication
@EnableScheduling
public class Quartzannotationdemo1Application {
    public static void main(String[] args) {
        SpringApplication.run(Quartzannotationdemo1Application.class, args);
    }
}

3.3、任务调度快速使用

@Component
public class QuartzTimedTask {
    //每5s执行一次
    @Scheduled(cron = "0/5 * * * * ?")
    public void process(){
        System.out.println("======process======"+new Date());
    }
}

结果输出:

3.4、源码下载

https://download.csdn.net/download/tangshiyilang/88632535

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1333215.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web架构师编辑器内容-使用html2canvas获取截图,并处理一些问题

html2canvas-api 为了使用html2canvas完成截图的功能&#xff0c;我们首先先使用一个按钮来测试一下html2canvas的截图功能。 首先在页面上创建一个img标签 <img id"test-image" :style"{ width: 300px}"/>创建一个button按钮&#xff0c;添加点击…

Python实验:关灯游戏

文章目录 前言一、设计表二、关键代码三、运行结果小地图&#xff0c;容易难度&#xff1a;中地图&#xff0c;中等难度&#xff1a;大地图&#xff0c;困难难度&#xff1a; 四、完整代码链接总结 前言 这是一个Python实验作业&#xff0c;内容如下&#xff1a; 题目要求&am…

boss app sig及sp参数,魔改base64

前言 大家好呀,欢迎来到我的博客.2023年12月4日,boss web上线了最新的zp_token,环境检测点又增加了,与此同时app端的关键加密so从32位换成了64位,两者ida反编译so的时候都有反调试,无法直接f5,需要手动调整让ida重新识别.google了一下几乎找不到任何有关boss app的文章,所以这…

玩转 Scrapy 框架 (一):Scrapy 框架介绍及使用入门

目录 一、Scrapy 框架介绍二、Scrapy 入门 一、Scrapy 框架介绍 简介&#xff1a; Scrapy 是一个基于 Python 开发的爬虫框架&#xff0c;可以说它是当前 Python 爬虫生态中最流行的爬虫框架&#xff0c;该框架提供了非常多爬虫的相关组件&#xff0c;架构清晰&#xff0c;可扩…

SpringSecurity深度解析与实践(3)

这里写自定义目录标题 引言SpringSecurity之授权授权介绍java权限集成 登录失败三次用户上锁 引言 SpringSecurity深度解析与实践&#xff08;2&#xff09;的网址 SpringSecurity之授权 授权介绍 Spring Security 中的授权分为两种类型&#xff1a; 基于角色的授权&#…

基于Springboot的留守儿童爱心网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的留守儿童爱心网站(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

怎么做好数字化工厂的建设?

怎样建设好的数字化工厂&#xff0c;不但须要有充足的费用预算&#xff0c;更加需要科学研究的计划和设计方案&#xff0c;一般做好智能化基本建设&#xff0c;务必要根据下列流程&#xff1a; 一.信息管理系统的计划和设计方案   许多的工厂会购买许多的单独的信息管理系统&…

基于SpringBoot+Vue的办公OA系统

开发环境 IDEA JDK1.8 MySQL8.0Node14.17.0 系统简介 本系统为前后端分离项目&#xff0c;主要拥有两个身份登录系统&#xff0c;管理员可以发布公告等信息&#xff0c;员工登录可以申请请假等信息&#xff0c;系统难度适中&#xff0c;适合学习研究使用&#xff0c;具体请…

深度学习中用来训练的train.py 探究学习2.0( 数据预处理)

数据预处理 下列代码为train.py中常见的一些数据处理方法 train_transform transforms.Compose([transforms.Resize((224, 224)),transforms.RandomVerticalFlip(),# 随机旋转&#xff0c;-45度到45度之间随机选transforms.RandomRotation(45),# 从中心开始裁剪transforms.C…

DaVinci各版本安装指南

链接: https://pan.baidu.com/s/1g1kaXZxcw-etsJENiW2IUQ?pwd0531 ​ #2024版 1.鼠标右击【DaVinci_Resolve_Studio_18.5(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 DaVinci_Resolve_Studio_18.5(64bit)】。 2.打开解压后的文…

rk3588 之启动

目录 uboot版本配置修改编译 linux版本配置修改编译 启动sd卡启动制作spi 烧录 参考 uboot 版本 v2024.01-rc2 https://github.com/u-boot/u-boot https://github.com/rockchip-linux/rkbin 配置修改 使用这两个配置即可&#xff1a; orangepi-5-plus-rk3588_defconfig r…

Flink 客户端操作命令及可视化工具

Flink提供了丰富的客户端操作来提交任务和与任务进行交互。下面主要从Flink命令行、Scala Shell、SQL Client、Restful API和 Web五个方面进行整理。 在Flink安装目录的bin目录下可以看到flink&#xff0c;start-scala-shell.sh和sql-client.sh等文件&#xff0c;这些都是客户…

【C->Cpp】深度解析#由C迈向Cpp(2)

目录 &#xff08;一&#xff09;缺省参数 全缺省参数 半缺省参数 缺省参数只能在函数的声明中出现&#xff1a; 小结&#xff1a; &#xff08;二&#xff09;函数重载 函数重载的定义 三种重载 在上一篇中&#xff0c;我们从第一个Cpp程序为切入&#xff0c;讲解了Cpp的…

纯HTML代码实现给图片增加水印并下载保存到本地

<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno"/><title>图片水印打码工具-宋佳乐博客</tit…

智能优化算法应用:基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于白鲸算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白鲸算法4.实验参数设定5.算法结果6.参考文献7.MA…

vue3 新项目 - 搭建路由router

创建router/index 文件 main.ts 安装 router 然后 在 app下面 去 设置 路由出口

P6 音频格式—— AAC

目录 前言 01 AAC是什么&#xff1f; 02 为什么需要进行AAC进行音频压缩处理&#xff1f; 03 AAC的特点以及优势 04 AAC格式详解&#xff1a; 4.1. ADIF的数据结构&#xff1a; 4.1.1 ADIF Header具体的表格: 4.2. ADTS的结构&#xff08;重点&#xff09;&#xff1a; …

项目管理4321方法论

文章目录 一、项目立项准备&#xff08;4步&#xff09;case1、识别价值---解决背后痛点的才是价值&#xff0c;价值是做任何事情的出发点case2、明确目标---支撑价值实现的&#xff0c;目标是 具体/可衡量/可达到/相关性/有时限的case3、识别干系人---找对人才能做对事&#x…

MYSQL函数\约束\多表查询\事务

函数 字符串函数 数值函数 mod就是取余 日期函数 流程函数 约束 外键约束 删除更新\外键 多表查询 多表关系 一对多 多对多 一对一 多表查询 内连接 select e.name d.name from emp e join dept d on e.id d.id; 外连接 select emp.*, d.name from emp left join tm…