Spring?Boot?集成?Quartz并使用Cron?表達(dá)式實(shí)現(xiàn)定時(shí)任務(wù)
Spring Boot整合Quartz主要是為了在Spring Boot應(yīng)用中方便地使用Quartz定時(shí)任務(wù)框架。Quartz是一個(gè)開(kāi)源的Java定時(shí)任務(wù)調(diào)度框架,可以方便地創(chuàng)建、管理和執(zhí)行定時(shí)任務(wù)。而Spring Boot則是一個(gè)基于Spring框架的快速開(kāi)發(fā)工具,可以簡(jiǎn)化Spring應(yīng)用的開(kāi)發(fā)和部署過(guò)程。
Quartz 基礎(chǔ)概念
1. 什么是 Quartz
Quartz 是一款開(kāi)源的 Java 任務(wù)調(diào)度框架,支持基于 Cron 表達(dá)式、固定間隔、固定時(shí)間點(diǎn)等多種調(diào)度規(guī)則,能實(shí)現(xiàn)任務(wù)的全生命周期管理(創(chuàng)建、暫停、恢復(fù)、刪除等),且支持集群部署和任務(wù)持久化,是 SpringBoot 項(xiàng)目中定時(shí)任務(wù)的首選方案。
2. 核心作用
- 定時(shí)執(zhí)行任務(wù):如定時(shí)同步數(shù)據(jù)、發(fā)送通知、生成報(bào)表等
- 動(dòng)態(tài)管理任務(wù):無(wú)需重啟應(yīng)用即可調(diào)整任務(wù)狀態(tài)
- 高可用支持:集群模式避免單點(diǎn)故障,持久化防止任務(wù)丟失
- 靈活調(diào)度策略:支持 Cron 表達(dá)式、簡(jiǎn)單間隔等多種觸發(fā)方式
3. 核心組件
- Job:任務(wù)執(zhí)行邏輯類(lèi)(實(shí)現(xiàn)
org.quartz.Job接口) - JobDetail:任務(wù)元數(shù)據(jù)(名稱(chēng)、分組、參數(shù)等)
- Trigger:調(diào)度規(guī)則(CronTrigger 基于 Cron 表達(dá)式)
- Scheduler:調(diào)度器(綁定 Job 和 Trigger 并執(zhí)行任務(wù))
前言
在 Spring Boot 項(xiàng)目中,我們經(jīng)常需要定時(shí)執(zhí)行某些任務(wù),例如定期清理數(shù)據(jù)庫(kù)、同步數(shù)據(jù)、發(fā)送通知等。Quartz 是一個(gè)強(qiáng)大的任務(wù)調(diào)度框架,可以通過(guò) 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 允許通過(guò) 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ù)名稱(chēng)
.storeDurably()
.build();
}
// 定義觸發(fā)器,使用 Cron 表達(dá)式
@Bean
public Trigger myJobTrigger() {
return TriggerBuilder.newTrigger()
.forJob(myJobDetail())
.withIdentity("myQuartzTrigger") // 觸發(fā)器名稱(chēng)
.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è)字段的含義如下:
| 字段 | 允許值 | 說(shuō)明 |
|---|---|---|
| 秒(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)度,并通過(guò) 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)! ??
生產(chǎn)環(huán)境注意事項(xiàng)
- 配置調(diào)整:
- 將
spring.quartz.jdbc.initialize-schema改為NEVER - 關(guān)閉 MyBatis-Plus SQL 日志(刪除
log-impl配置)
- 將
- 集群部署:
- 開(kāi)啟
isClustered: true - 所有節(jié)點(diǎn)連接同一數(shù)據(jù)庫(kù)
- 確保服務(wù)器時(shí)間同步
- 開(kāi)啟
- 任務(wù)類(lèi)規(guī)范:
- 必須有無(wú)參構(gòu)造方法
- 全路徑在集群環(huán)境中保持一致
- 異常處理:
- 任務(wù)執(zhí)行類(lèi)中添加異常捕獲
- 關(guā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)文章
java獲得平臺(tái)相關(guān)的行分隔符和java路徑分隔符的方法
不同系統(tǒng)平臺(tái)下的行分隔符、路徑分隔符等常常不同,如何在Java程序獲取當(dāng)前平臺(tái)的分隔符,以及其他系統(tǒng)相關(guān)的狀態(tài)呢?下面是示例程序,需要的朋友可以參考下2014-02-02
Spring Boot2.0中SpringWebContext找不到無(wú)法使用的解決方法
這篇文章主要給大家介紹了關(guān)于Spring Boot2.0中SpringWebContext找不到無(wú)法使用的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Spring?Validation參數(shù)效驗(yàn)的各種使用姿勢(shì)總結(jié)
在實(shí)際項(xiàng)目中經(jīng)常需要對(duì)前段傳來(lái)的數(shù)據(jù)進(jìn)行校驗(yàn),下面這篇文章主要給大家介紹了關(guān)于Spring?Validation參數(shù)效驗(yàn)的各種使用姿勢(shì),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
SpringBoot四大神器之Actuator的使用小結(jié)
這篇文章主要介紹了SpringBoot四大神器之Actuator的使用小結(jié),詳細(xì)的介紹了Actuator的使用和端點(diǎn)的使用,有興趣的可以了解一下2017-11-11
Spring攔截器實(shí)現(xiàn)鑒權(quán)的示例代碼
本文主要介紹了Spring攔截器實(shí)現(xiàn)鑒權(quán)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
spring?boot?實(shí)現(xiàn)一個(gè)?禁止重復(fù)請(qǐng)求的方法
這篇文章主要介紹了spring?boot?實(shí)現(xiàn)一個(gè)?禁止重復(fù)請(qǐng)求,當(dāng)重復(fù)請(qǐng)求該方法時(shí),會(huì)返回"Duplicate?request",避免重復(fù)執(zhí)行相同的操作,需要的朋友可以參考下2024-03-03

