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

相关推荐
心之语歌3 小时前
Spring boot 项目 Spring 注入 代理 并支持 代理对象使用 @Autowired 去调用其他服务
spring boot·后端·spring
水宝的滚动歌词4 小时前
设计模式之建造者模式
java·设计模式·建造者模式
孤蓬&听雨4 小时前
Java SpringBoot使用Apache POI导入导出Excel文件
java·spring boot·apache·excel导出·excel导入
自律小仔4 小时前
桌面开发 的变量声明(Variable Declaration)核心知识
开发语言·后端·golang
紫琪软件工作室5 小时前
自定义有序Map
java
刘婉晴5 小时前
【蓝桥杯研究生组】第14届Java试题答案整理
java·蓝桥杯
Upuping6 小时前
「全网最细 + 实战源码案例」设计模式——外观模式
java·后端·设计模式
等一场春雨6 小时前
Java 21 使用新的日期和时间 API (java.time) 计算当前日期是某活动起始时间的第几天
java·开发语言
拖孩6 小时前
💥大家好,我是拖孩🎤
前端·javascript·后端
AI向前看6 小时前
T-SQL语言的正则表达式
开发语言·后端·golang