Spring?Boot?集成?Quartz并使用Cron?表達(dá)式實(shí)現(xiàn)定時(shí)任務(wù)
前言
在 Spring Boot 項(xiàng)目中,我們經(jīng)常需要定時(shí)執(zhí)行某些任務(wù),例如定期清理數(shù)據(jù)庫、同步數(shù)據(jù)、發(fā)送通知等。Quartz 是一個(gè)強(qiáng)大的任務(wù)調(diào)度框架,可以通過 Cron 表達(dá)式 實(shí)現(xiàn)靈活的任務(wù)調(diào)度。本篇文章將介紹如何在 Spring Boot 中集成 Quartz 并使用 Cron 表達(dá)式 進(jìn)行任務(wù)調(diào)度。
1. 添加 Quartz 依賴
在 Spring Boot 項(xiàng)目中,首先需要引入 Quartz 相關(guān)依賴。
如果使用 Maven,在 pom.xml
中添加以下依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
如果使用 Gradle,則添加:
implementation 'org.springframework.boot:spring-boot-starter-quartz'
2. 創(chuàng)建 Quartz 任務(wù)
在 Quartz 中,每個(gè)定時(shí)任務(wù)需要繼承 org.quartz.Job
接口,并實(shí)現(xiàn) execute
方法。
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.time.LocalDateTime; public class MyQuartzJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Quartz 定時(shí)任務(wù)執(zhí)行中:" + LocalDateTime.now()); } }
3. 配置 Quartz 任務(wù)調(diào)度
Spring Boot 允許通過 SchedulerFactoryBean
配置 Quartz 任務(wù),并使用 @Bean
方式定義任務(wù)的調(diào)度規(guī)則。
import org.quartz.*; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class QuartzConfig { // 定義 JobDetail @Bean public JobDetail myJobDetail() { return JobBuilder.newJob(MyQuartzJob.class) .withIdentity("myQuartzJob") // 任務(wù)名稱 .storeDurably() .build(); } // 定義觸發(fā)器,使用 Cron 表達(dá)式 @Bean public Trigger myJobTrigger() { return TriggerBuilder.newTrigger() .forJob(myJobDetail()) .withIdentity("myQuartzTrigger") // 觸發(fā)器名稱 .withSchedule(CronScheduleBuilder.cronSchedule("0 0/5 0-7 ? * * *")) // Cron 表達(dá)式 .build(); } }
在上述配置中,我們的定時(shí)任務(wù):
- 每 5 分鐘執(zhí)行一次
- 每天從 00:00 到 07:59 之間執(zhí)行
- 使用 Cron 表達(dá)式
0 0/5 0-7 ? * * *
如果需要 08:00 也執(zhí)行一次,可以修改 Cron 表達(dá)式為:
0 0/5 0-8 ? * * *
4. 啟動(dòng) Spring Boot 觀察定時(shí)任務(wù)執(zhí)行
啟動(dòng) Spring Boot 項(xiàng)目,觀察控制臺(tái)輸出:
Quartz 定時(shí)任務(wù)執(zhí)行中:2024-03-19T00:00:00
Quartz 定時(shí)任務(wù)執(zhí)行中:2024-03-19T00:05:00
Quartz 定時(shí)任務(wù)執(zhí)行中:2024-03-19T00:10:00
...
Quartz 定時(shí)任務(wù)執(zhí)行中:2024-03-19T07:55:00
如果 Cron 表達(dá)式修改為 0 0/5 0-8 ? * * *
,則會(huì)多執(zhí)行一次:
Quartz 定時(shí)任務(wù)執(zhí)行中:2024-03-19T08:00:00
5. Quartz Cron 表達(dá)式詳解
Quartz 的 Cron 表達(dá)式有 7 個(gè)字段,每個(gè)字段的含義如下:
字段 | 允許值 | 說明 |
---|---|---|
秒(Seconds) | 0-59 | 任務(wù)觸發(fā)的秒數(shù) |
分(Minutes) | 0-59 | 任務(wù)觸發(fā)的分鐘數(shù) |
小時(shí)(Hours) | 0-23 | 任務(wù)觸發(fā)的小時(shí)數(shù) |
日期(Day of month) | 1-31 | 任務(wù)觸發(fā)的日期(不能與 Day of week 同時(shí)指定) |
月份(Month) | 1-12 或 JAN-DEC | 任務(wù)觸發(fā)的月份 |
星期(Day of week) | 1-7 或 SUN-SAT | 任務(wù)觸發(fā)的星期幾 |
年(可選) | 空 或 1970-2099 | 任務(wù)觸發(fā)的年份 |
示例 Cron 表達(dá)式:
0 0 12 * * ?
→ 每天中午 12:00 執(zhí)行0 0/30 * * * ?
→ 每 30 分鐘執(zhí)行一次0 15 10 * * ?
→ 每天 10:15 執(zhí)行0 0 8-20/2 * * ?
→ 每天 08:00 - 20:00 之間,每 2 小時(shí)執(zhí)行一次
6. 結(jié)論
本篇文章介紹了如何在 Spring Boot 中集成 Quartz 進(jìn)行定時(shí)任務(wù)調(diào)度,并通過 Cron 表達(dá)式 控制任務(wù)執(zhí)行時(shí)間。Quartz 提供了更強(qiáng)大的任務(wù)調(diào)度能力,比 @Scheduled
注解更靈活,適用于復(fù)雜的定時(shí)任務(wù)需求。
你是否在項(xiàng)目中使用 Quartz?歡迎在評(píng)論區(qū)分享你的經(jīng)驗(yàn)! ??
到此這篇關(guān)于Spring Boot 集成 Quartz并使用Cron 表達(dá)式實(shí)現(xiàn)定時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)Spring Boot 集成Quartz內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+Quartz實(shí)現(xiàn)定時(shí)任務(wù)的代碼模版分享
- SpringBoot日程管理Quartz與定時(shí)任務(wù)Task實(shí)現(xiàn)詳解
- SpringBoot+Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)
- SpringBoot?整合?Quartz?定時(shí)任務(wù)框架詳解
- SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解
- springboot整合quartz定時(shí)任務(wù)框架的完整步驟
- SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能
- SpringBoot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)的方法
- 淺談SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù)
- Springboot整個(gè)Quartz實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)的示例代碼
相關(guān)文章
SpringMVC實(shí)現(xiàn)文件上傳和下載功能
這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)文件上傳和下載功能 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08詳解javaweb中jstl如何循環(huán)List中的Map數(shù)據(jù)
這篇文章主要介紹了詳解javaweb中jstl如何循環(huán)List中的Map數(shù)據(jù)的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10SpringBoot3整合mybatis-plus的實(shí)現(xiàn)
MyBatis-Plus是一個(gè)MyBatis的增強(qiáng)工具,在MyBatis的基礎(chǔ)上只做增強(qiáng)不做改變,本文主要介紹了Mybatis-Plus3.x的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10idea整合deepseek實(shí)現(xiàn)AI輔助編程的流程步驟
文章介紹了如何在IntelliJ IDEA中整合DeepSeek平臺(tái)實(shí)現(xiàn)AI輔助編程,步驟包括安裝CodeGPT插件、注冊(cè)DeepSeek開發(fā)者賬號(hào)、配置API密鑰以及設(shè)置API信息,需要的朋友可以參考下2025-02-02JDK動(dòng)態(tài)代理的深入理解與實(shí)際應(yīng)用
這篇文章主要介紹了JDK動(dòng)態(tài)代理的深入理解與實(shí)際應(yīng)用,在Java的世界里,JDK的動(dòng)態(tài)代理是一項(xiàng)非常強(qiáng)大且實(shí)用的技術(shù),它為我們?cè)谶\(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理類提供了可能,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象方法調(diào)用的靈活攔截和增強(qiáng),需要的朋友可以參考下2025-02-02MyEclipse打開文件跳轉(zhuǎn)到notepad打開問題及解決方案
windows系統(tǒng)打開README.md文件,每次都需要右鍵選擇notepad打開,感覺很麻煩,然后就把README.md文件打開方式默認(rèn)選擇了notepad,這樣每次雙擊就能打開,感覺很方便,這篇文章主要介紹了MyEclipse打開文件跳轉(zhuǎn)到notepad打開問題,需要的朋友可以參考下2024-03-03MyBatis-Flex實(shí)現(xiàn)分頁查詢的示例代碼
在MyBatis-Flex中實(shí)現(xiàn)分頁查詢時(shí),需要注意維護(hù)一個(gè)獲取數(shù)據(jù)庫總數(shù)的方法,詳細(xì)介紹了UserService、UserServiceImpl類以及Mapper.xml配置,感興趣的可以了解一下2024-10-10