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

相关推荐
倚栏听风雨30 分钟前
SwingUtilities.invokeLater 详解
后端
Java中文社群33 分钟前
AI实战:一键生成数字人视频!
java·人工智能·后端
王中阳Go1 小时前
从超市收银到航空调度:贪心算法如何破解生活中的最优决策谜题?
java·后端·算法
shepherd1111 小时前
谈谈TransmittableThreadLocal实现原理和在日志收集记录系统上下文实战应用
java·后端·开源
维基框架1 小时前
Spring Boot 项目整合Spring Security 进行身份验证
java·架构
关山月2 小时前
使用 Ollama 和 Next.js 构建 AI 助手
后端
倚栏听风雨2 小时前
SwingWorker详解
后端
深栈解码2 小时前
OpenIM 源码深度解析系列(二):双Token认证机制与接入流程
后端
考虑考虑2 小时前
feign异常处理
spring boot·后端·spring
日月星辰Ace2 小时前
Java JVM 垃圾回收器(四):现代垃圾回收器 之 Shenandoah GC
java·jvm