springboot整合Quartz实现定时任务

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在项目中我们会有许多要进行定时执行逻辑的业务场景,比如定期生成日报、定期发送通知等。在遇到这些场景时,使用Quartz框架可以快速的完成功能。


1.核心概念

Job :任务。定时执行的具体任务内容
JobDetail :任务详情。即与任务相关的其他配置信息
Trigger :触发器,主要负责描述任务执行的时间规则(特定时间频率或者时间点)
Scheduler :调度器。将Job和Trigger整合起来

2.基础实现

2.1引入依赖

2.2创建具体逻辑类

我们需要编写实现具体逻辑的类,这个类要么实现Job接口,要么继承QuartzJobBean类

这里我们使用第一种

在Job实现类上,我们有两个可用注解:

  • @PersistJobDataAfterExecution:有状态的job。在执行过程中,每次执行定时任务都会创建一个新的JobDetail对象,其中的用于存储共享数据的Map集合也只会存储初始化的数据,如果每次定时任务中需要使用并修改里面的数据并保留修改结果,则需要添加此注解。
  • @DisallowConcurrentExecution:禁止并发访问同一个job定义。定时任务中有时可能出现以下情况------任务执行时间比周期时间更长,就是说上一次任务还没执行完就到了下一次任务的执行时间了,形成并发的局面。使用此注解可以让当前定时任务即使到时间后也要等待上一次任务完成才执行。

2.3配置类

我们现在有了Job类,现在我们要在一个配置类中提供JobDetail和Trigger并为三者绑定关系。

在定义jobDetail时可用使用usingJobData()方法来向其中的Map集合存入数据:

这里我们在提供Trigger对象时可以定义日期表达式,来决定任务执行的时间和频率。并且与依赖中提供的默认schedule绑定。

日期表达式是一个字符串,具体规则如下:
cron表达式

表达式格式(7个字段):秒 分 时 日 月 星期几 年,例如:0 0 13 24 1 ?2024
特殊符号

*可以理解为每的意思,每秒、每分、每天、每回、每年

?问号只能出现在日和星期这两个位置,表示这个位置的值不确定

-减号表示一个范围。例如:小时字段10-12,代表10到12点之间

,逗号表示一个列表。例如:星期字段1,3,5代表周一、周三、周五三天

/斜杠表示频率。例如:秒字段0/15就是从0秒开始,每隔15秒执行一次

接下来,我们已经有了job对象,jobdetail对象,trigger对象。

据一开始的介绍,我们的结构中应该还有一个调度器(Scheduler ),这个对象并不要求一定要手动创建,spring中会默认提供一个调度器对象 。后面要实现动态调度或者多任务执行时候才会自己手动创建调度器对象。

所以,至此,简单的定时任务的配置流程已经完成了。


总结

本文讲解了如何使用Quartz来开启一个简单的定时任务。

相关推荐
虹科网络安全33 分钟前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje1 小时前
Java语法进阶
java·开发语言·jvm
uzong1 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan1 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv71 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫1 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287921 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本1 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
止语Lab1 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
yaoxin5211232 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python