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来开启一个简单的定时任务。

相关推荐
BingoGo1 分钟前
Laravel13 + Vue3 的免费可商用 PHP 管理后台 CatchAdmin V5.2.0 发布
后端·php·laravel
范什么特西5 分钟前
MyEclipse8.5配置
java·ide·myeclipse
想带你从多云到转晴6 分钟前
05、数据结构与算法---栈与队列
java·数据结构·算法
QuZero11 分钟前
ReentrantLock principle
java·算法
zjshuster14 分钟前
流程引擎(Process Engine)简介
java·数据库·servlet
Halo_tjn15 分钟前
Java 抽象类 知识点
java·开发语言·算法
rannn_11125 分钟前
【Redis|高级篇1】分布式缓存|持久化(RDB、AOF)、主从集群、哨兵、分片集群
java·redis·分布式·后端·缓存
weixin_4080996729 分钟前
【实战教程】EasyClick 调用 OCR 文字识别 API(自动识别屏幕文字 + 完整示例代码)
前端·人工智能·后端·ocr·api·安卓·easyclick
PD我是你的真爱粉29 分钟前
Redis 持久化、过期删除、淘汰策略与内存碎片全解析
java·redis·bootstrap
添尹30 分钟前
Go语言基础之指针
开发语言·后端·golang