SpringBoot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)方式(Cron表達(dá)式示例)
前言
在 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ù)名稱
.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è)字段的含義如下:
| 字段 | 允許值 | 說(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ù)需求。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Springboot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)代碼實(shí)例
- SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)
- SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)詳解
- springBoot項(xiàng)目集成quartz開發(fā)定時(shí)任務(wù)案例及注意事項(xiàng)
- SpringBoot集成Quartz實(shí)現(xiàn)定時(shí)任務(wù)的方法
- 淺談SpringBoot集成Quartz動(dòng)態(tài)定時(shí)任務(wù)
- SpringBoot與Quartz集成實(shí)現(xiàn)分布式定時(shí)任務(wù)集群的代碼實(shí)例
相關(guān)文章
字節(jié)二面SpringBoot可以同時(shí)處理多少請(qǐng)求
這篇文章主要為大家介紹了字節(jié)二面之SpringBoot可以同時(shí)處理多少請(qǐng)求面試分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
基于java類路徑classpath和包的實(shí)例講解
下面小編就為大家分享一篇基于java類路徑classpath和包的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝教程
這篇文章主要介紹了windows10 JDK安裝及配置環(huán)境變量與Eclipse安裝,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
spring使用OXM進(jìn)行對(duì)象XML映射解析
這篇文章主要介紹了spring使用OXM進(jìn)行對(duì)象XML映射解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12
java使用JMF實(shí)現(xiàn)音樂(lè)播放功能
這篇文章主要為大家詳細(xì)介紹了java使用JMF實(shí)現(xiàn)音樂(lè)播放的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Spring?Cache+Redis緩存數(shù)據(jù)的實(shí)現(xiàn)示例
本文主要介紹了Spring?Cache+Redis緩存數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
深度解析Java常量池中的Integer緩沖池和String常量池
為了減少對(duì)象重復(fù)創(chuàng)建、提升運(yùn)行時(shí)效率,Java 內(nèi)部提供了兩種重要的優(yōu)化機(jī)制Integer 緩沖池(IntegerCache)和 String 常量池(String Pool),本文將深入剖析兩大常量池的底層實(shí)現(xiàn)、工作流程、適用范圍,并通過(guò)流程圖和代碼示例幫助你徹底掌握2026-05-05

