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

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 {@Beanpublic JobDetail jobDetail(){JobDetail detail= JobBuilder.newJob(MyQuartzJob.class).withIdentity("job1","group1").storeDurably()//设置Job持久化//设置job数据.usingJobData("username","xiaochun").usingJobData("useraddr","安徽合肥").build();return detail;}//创建触发器,触发实例@Beanpublic Trigger trigger(){Trigger trigger= TriggerBuilder.newTrigger().forJob(jobDetail()).withIdentity("trigger1","group1").startNow().build();return trigger;}
}

2.4、创建JoB具体任务

@Slf4j
public class MyQuartzJob extends QuartzJobBean {@Overrideprotected 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 * * * * ?");@Beanpublic JobDetail jobDetail(){JobDetail detail= JobBuilder.newJob(MyQuartzJob.class).withIdentity("job1","group1").storeDurably()//设置Job持久化//设置job数据.usingJobData("data","自定义数据").build();return detail;}//创建触发器,触发实例@Beanpublic 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 {@Beanpublic JobDetail jobDetail(){JobDetail detail= JobBuilder.newJob(MyQuartzJob.class).withIdentity("job1","group1").storeDurably()//设置Job持久化//设置job数据.usingJobData("username","xiaochun").usingJobData("useraddr","安徽合肥").build();return detail;}//创建触发器,触发实例@Beanpublic 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 {@Overrideprotected 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.hqwc.cn/news/294741.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【电源专题】Buck电源上电震荡谁的错?

在文章:【电源专题】案例:Buck芯片上电瞬间波形震荡?从别的人案例中来学习软启参数中我们通过别人的文章了解到了Buck芯片上电瞬间波形震荡有几个方法可以解决,但主要还是围绕着软启动参数去学习。因为文章中无法知道编者所用的电源芯片和电路,所以无法进行分析。 最近我…

软件工程中关键的图-----知识点总结

目录 1.数据流图 2.变换型设计和事务型设计 3.程序流程图 4.NS图和PAD图&#xff1a; 5.UML图 1.用例图 2.类图 3.顺序图 4.协作图 本文为个人复习资料&#xff0c;包含个人复习思路&#xff0c;多引用&#xff0c;也想和大家分享一下&#xff0c;希望大家不要介意~ …

NPOI 导出Excel提示内容有问题的解决方法

NPOI导出Excel 使用Microsoft Excel 打开提示内容有问题&#xff0c;如下&#xff1a; 原因是&#xff1a;在使用NPOI导出excel时&#xff0c;获得 workbook.Write(ms)生成的 MemoryStream后&#xff0c;使用了 ms.GetBuffer()返回文件内容&#xff0c;导致生成的 Excel文件结尾…

14 款最佳文件恢复软件 [2024 年最佳精选工具]

顶级文件恢复软件的综合列表和比较。阅读此详细评论以选择最佳文件恢复工具并轻松恢复您的文件&#xff1a; 您在选择文件恢复工具时遇到困难吗&#xff1f;在阅读了对十大文件恢复软件的评论后&#xff0c;您可以做出正确的决定。 数据丢失是一个严重的问题&#xff0c;会损…

MFC 自定义压缩,解压缩工具

界面效果如下&#xff1a; 对外提供的接口如下&#xff1a; public: void setCallback(zp::Callback callback, void* param); bool open(const zp::String& path, bool readonly false); bool create(const zp::String& path, const zp::String& inputPath)…

SLAM算法与工程实践——雷达篇:Livox激光雷达使用

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

算法训练营Day25(回溯)

216.组合总和III 216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; class Solution {private List<Integer> path new ArrayList<>();private List<List<Integer>> result new ArrayList<>();public List<List<Integer>&g…

C++ map和vector向量使用方法

C map用法 C 中 map 提供的是一种键值对容器&#xff0c;里面的数据都是成对出现的,如下图&#xff1a;每一对中的第一个值称之为关键字(key)&#xff0c;每个关键字只能在 map 中出现一次&#xff1b;第二个称之为该关键字的对应值。 map的使用 需要导入头文件 #include …

51单片机(STC8)-- 串口配置及串口重定向(printf)

文章目录 STC8串口概述串口寄存器配置串口1控制寄存器SCON串口1数据寄存器SBUF串口1模式 1工作方式串口1波特率计算方式 串口注意事项串口1通信demo串口重定向 STC8串口概述 由下图可知STC8H3K64S4带有4个4个串行通信接口&#xff0c;芯片名后两位S所带的数字即代表这款芯片带…

Ubuntu 常用命令之 exit 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 exit命令在Ubuntu系统下用于结束一个终端会话。它可以用于退出当前的shell&#xff0c;结束当前的脚本执行&#xff0c;或者结束一个ssh会话。 exit命令的参数是一个可选的整数&#xff0c;用于指定退出状态。如果没有指定&#…

Linux top命令详解,看这篇就够了

Linux top命令详解 top命令截图top详情面板解释top数据列解释top -hvtop交互式命令top交互模式帮助文档常见指令 top 是 Linux 系统中用于实时监视系统状态的工具。它可以显示系统中的 CPU 使用率、内存使用情况、运行中的进程等信息&#xff0c;并且还可以实时更新这些信息。 …

TCP协议:可靠传输的基石

目录 1. 数据完整性的保证 2. 数据的有序传输 3. 确认应答机制 4. 流量控制 5. 拥塞控制 6. 重传机制 结论 引言 TCP&#xff08;Transmission Control Protocol&#xff09;是计算机网络中的一个重要协议&#xff0c;它以其可靠性而闻名。TCP是一种面向连接的协议&…