SpringBoot3整合Quartz實現(xiàn)定時任務的示例
1. 什么是 Quartz Scheduler?
Quartz 是 Java 平臺下的一個強大、靈活的調度庫,它支持復雜的任務調度,包括:
- 簡單的任務:按固定頻率或延遲執(zhí)行任務。
- 基于 Cron 表達式的任務:支持類似于 Linux Cron 的表達式,用于定義復雜的定時任務。
- 持久化任務:支持將任務數(shù)據(jù)持久化存儲,以便在應用程序重啟后可以恢復任務狀態(tài)。
2. Spring Boot 3 集成 Quartz Scheduler 的優(yōu)勢
- 無縫集成:通過 Spring Boot 3 的自動配置特性,無需編寫復雜的配置即可使用 Quartz。
- 靈活管理:支持任務的動態(tài)添加、暫停、恢復和刪除。
- 擴展性:可以輕松擴展任務調度系統(tǒng),便于業(yè)務邏輯的復雜應用。
3. Spring Boot 3 集成 Quartz 的步驟
3.1 創(chuàng)建 Spring Boot 項目
可以使用 Spring Initializr 創(chuàng)建項目,選擇以下依賴:
- Spring Web
- Quartz Scheduler
3.2 添加 Quartz 依賴
如果使用的是手動創(chuàng)建的項目,可以在 pom.xml
中添加 Quartz 的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
3.3 配置 Quartz 屬性
在 application.yml
或 application.properties
文件中配置 Quartz 的基本屬性,例如任務存儲和調度方式。
以下是 application.yml
配置示例:
spring: application: name: spring-boot3-19-quartz quartz: job-store-type: memory # 儲類型為內存存儲 properties: org: quartz: threadPool: threadCount: 5 # 配置線程池線程數(shù)為 5 jobStore: misfireThreshold: 60000 # 設置作業(yè)存儲的錯過觸發(fā)閾值為 60000 毫秒(1分鐘)
這里使用了內存存儲方式(job-store-type: memory
),也可以根據(jù)需要配置數(shù)據(jù)庫存儲任務信息。
3.4 創(chuàng)建一個 Quartz 任務類
創(chuàng)建一個簡單的 Quartz 任務類,需要實現(xiàn) Job
接口,并重寫 execute
方法:
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class SampleJob implements Job { private static final Logger logger = LoggerFactory.getLogger(SampleJob.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { logger.info("Executing Sample Job at: " + context.getFireTime()); } }
3.5 配置任務調度器
在 Spring Boot 3 中,可以通過 @Configuration
創(chuàng)建 Quartz 的調度器,并配置定時任務的觸發(fā)器(Trigger)和任務詳情(JobDetail)。
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class QuartzConfig { @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class) .withIdentity("sampleJob") .storeDurably() .build(); } @Bean public Trigger sampleJobTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(10) // 每 10 秒執(zhí)行一次 .repeatForever(); return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withIdentity("sampleJobTrigger") .withSchedule(scheduleBuilder) .build(); } }
sampleJobDetail
方法定義了任務的基本信息,包括任務類和名稱。sampleJobTrigger
方法定義了觸發(fā)器的調度策略,這里設置為每 10 秒執(zhí)行一次。
3.6 使用 Cron 表達式配置任務
除了簡單的時間間隔,還可以通過 Cron 表達式實現(xiàn)更靈活的調度。以下示例展示如何使用 Cron 表達式配置任務觸發(fā)器。
import org.quartz.CronScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; @Bean public Trigger cronJobTrigger() { return TriggerBuilder.newTrigger() .forJob(sampleJobDetail()) .withIdentity("cronJobTrigger") .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *")) // 每分鐘執(zhí)行一次 .build(); }
在這個例子中,Cron 表達式 "0 0/1 * 1/1 * ? *" 表示每分鐘執(zhí)行一次任務。
4. 運行應用并查看日志
配置完成后,啟動 Spring Boot 應用。Quartz Scheduler 會按照配置執(zhí)行 SampleJob 任務。您可以在控制臺中看到日志輸出,類似如下:
2024-11-13T21:07:39.910+08:00 INFO 11984 --- [spring-boot3-18-quartz] [eduler_Worker-4] c.coderjia.boot318quartz.job.SampleJob : Executing Sample Job at: Wed Nov 13 21:07:39 CST 2024
每 10 秒執(zhí)行一次效果:
每分鐘執(zhí)行一次效果:
5. 動態(tài)管理 Quartz 任務
可以在代碼中動態(tài)地添加、暫停、恢復和刪除任務。例如,以下是動態(tài)添加任務的示例:
package com.coderjia.boot318quartz; import org.quartz.JobDetail; import org.quartz.JobKey; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.Trigger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author CoderJia * @create 2024/11/13 下午 09:25 * @Description **/ @Service public class QuartzService { private final Scheduler scheduler; @Autowired public QuartzService(Scheduler scheduler) { this.scheduler = scheduler; } public void scheduleJob(JobDetail jobDetail, Trigger trigger) { try { scheduler.scheduleJob(jobDetail, trigger); } catch (Exception e) { e.printStackTrace(); } } public void pauseJob(String jobName, String jobGroup) { try { JobKey jobKey = new JobKey(jobName, jobGroup); scheduler.pauseJob(jobKey); System.out.println("Job paused: " + jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } public void resumeJob(String jobName, String jobGroup) { try { JobKey jobKey = new JobKey(jobName, jobGroup); scheduler.resumeJob(jobKey); System.out.println("Job resumed: " + jobKey); } catch (SchedulerException e) { e.printStackTrace(); } } public void deleteJob(String jobName, String jobGroup) { try { JobKey jobKey = new JobKey(jobName, jobGroup); boolean deleted = scheduler.deleteJob(jobKey); if (deleted) { System.out.println("Job deleted: " + jobKey); } else { System.out.println("Job not found: " + jobKey); } } catch (SchedulerException e) { e.printStackTrace(); } } }
調用 scheduleJob
方法可以動態(tài)地添加新的任務。類似地,使用 scheduler.pauseJob()
和 scheduler.deleteJob()
可以暫停或刪除任務。
6. 總結
通過將 Quartz 與 Spring Boot 3 結合,我們可以實現(xiàn)強大而靈活的定時任務調度系統(tǒng)。本文介紹了 Quartz 的基本配置和使用方法,包括如何配置任務、觸發(fā)器,以及使用 Cron 表達式實現(xiàn)復雜的調度策略。
以上就是SpringBoot3整合Quartz實現(xiàn)定時任務的示例的詳細內容,更多關于SpringBoot3 Quartz定時任務的資料請關注腳本之家其它相關文章!
相關文章
JavaFX程序初次運行創(chuàng)建數(shù)據(jù)庫并執(zhí)行建表SQL詳解
這篇文章主要介紹了JavaFX程序初次運行創(chuàng)建數(shù)據(jù)庫并執(zhí)行建表SQL詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-08-08基于Java8 Stream API實現(xiàn)數(shù)據(jù)抽取收集
這篇文章主要介紹了基于Java8 Stream API實現(xiàn)數(shù)據(jù)抽取收集,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03Flink實戰(zhàn)之實現(xiàn)流式數(shù)據(jù)去重
流式數(shù)據(jù)是一種源源不斷產(chǎn)生的數(shù)據(jù),本文探索了一種流式大數(shù)據(jù)的實時去重方法,不一定適用于所有場景,不過或許可以給面對相似問題的你一點點啟發(fā),2025-03-03