Spring Boot中使用@Scheduled和Quartz實(shí)現(xiàn)定時(shí)任務(wù)的詳細(xì)過(guò)程
- 演示環(huán)境說(shuō)明:
- 開(kāi)發(fā)工具:IDEA 2021.3
- JDK版本: JDK 1.8
- Spring Boot版本:2.3.1 RELEASE
- Maven版本:3.8.2
- 操作系統(tǒng):Windows 11
?? 前言:定時(shí)任務(wù)和調(diào)度的應(yīng)用場(chǎng)景
定時(shí)任務(wù)和調(diào)度是現(xiàn)代應(yīng)用中常見(jiàn)的功能,特別是在需要執(zhí)行周期性任務(wù)的情況下,例如定時(shí)備份數(shù)據(jù)、發(fā)送通知、清理臨時(shí)文件等。在微服務(wù)架構(gòu)、分布式系統(tǒng)以及大規(guī)模應(yīng)用中,定時(shí)任務(wù)的管理變得更加重要。
Spring Boot提供了兩種常見(jiàn)的定時(shí)任務(wù)實(shí)現(xiàn)方式:一種是基于@Scheduled注解的簡(jiǎn)單定時(shí)任務(wù),另一種是功能更強(qiáng)大的Quartz框架。本文將介紹如何在Spring Boot中使用這兩種方式實(shí)現(xiàn)定時(shí)任務(wù)和調(diào)度功能。
?? 定時(shí)任務(wù)概述
定時(shí)任務(wù)是指按照預(yù)定的時(shí)間間隔或固定的時(shí)間點(diǎn)執(zhí)行的任務(wù)。它可以是簡(jiǎn)單的周期性執(zhí)行任務(wù),也可以是復(fù)雜的定時(shí)調(diào)度任務(wù)。常見(jiàn)的定時(shí)任務(wù)應(yīng)用包括:
- 定期清理緩存或臨時(shí)文件
- 定時(shí)報(bào)告生成與發(fā)送
- 定期同步外部數(shù)據(jù)
- 定時(shí)檢查系統(tǒng)健康狀態(tài)
定時(shí)任務(wù)調(diào)度的分類
- 固定間隔任務(wù):每隔固定時(shí)間執(zhí)行一次任務(wù)。
- 固定時(shí)間點(diǎn)任務(wù):在特定的時(shí)間點(diǎn)執(zhí)行任務(wù)(例如每天午夜12點(diǎn))。
- 復(fù)雜調(diào)度任務(wù):需要支持更靈活調(diào)度的場(chǎng)景,比如Quartz調(diào)度框架。
??? 方法一:使用@Scheduled注解
Spring Boot內(nèi)置的@Scheduled注解非常適合用于簡(jiǎn)單的定時(shí)任務(wù),支持定時(shí)任務(wù)的執(zhí)行和控制。你只需要在方法上添加@Scheduled注解,并配置執(zhí)行的時(shí)間策略。
1. 啟用定時(shí)任務(wù)
要使用@Scheduled注解,首先需要在Spring Boot的主類或配置類上啟用定時(shí)任務(wù)功能:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 啟用定時(shí)任務(wù)功能
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}- @EnableScheduling:該注解啟用Spring的定時(shí)任務(wù)調(diào)度功能。
2. 使用@Scheduled注解
@Scheduled注解可以接受多種參數(shù)來(lái)定義定時(shí)任務(wù)的執(zhí)行策略:
- fixedRate:每隔固定時(shí)間執(zhí)行任務(wù)(單位:毫秒),無(wú)論上一個(gè)任務(wù)是否完成。
- fixedDelay:任務(wù)結(jié)束后延遲一定時(shí)間再執(zhí)行下一次任務(wù)。
- initialDelay:任務(wù)開(kāi)始執(zhí)行前的延遲時(shí)間。
- cron:使用Cron表達(dá)式指定任務(wù)的執(zhí)行時(shí)間。
示例:簡(jiǎn)單的定時(shí)任務(wù)
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class SimpleScheduledTask {
// 每5秒執(zhí)行一次
@Scheduled(fixedRate = 5000)
public void runTask() {
System.out.println("任務(wù)執(zhí)行了! " + System.currentTimeMillis());
}
// 延遲1秒后開(kāi)始,每次執(zhí)行完后間隔3秒再執(zhí)行
@Scheduled(initialDelay = 1000, fixedDelay = 3000)
public void runDelayedTask() {
System.out.println("延遲任務(wù)執(zhí)行! " + System.currentTimeMillis());
}
// 使用Cron表達(dá)式,每天午夜12點(diǎn)執(zhí)行任務(wù)
@Scheduled(cron = "0 0 0 * * ?")
public void runCronTask() {
System.out.println("Cron任務(wù)執(zhí)行! " + System.currentTimeMillis());
}
}- fixedRate:每5秒執(zhí)行一次任務(wù)。
- fixedDelay:延遲1秒后開(kāi)始,每次執(zhí)行完后延遲3秒再執(zhí)行。
- cron:根據(jù)Cron表達(dá)式每天午夜12點(diǎn)執(zhí)行任務(wù)。
3. 配置@Scheduled的參數(shù)
@Scheduled提供了靈活的配置方式,可以根據(jù)不同需求選擇合適的方式:
- fixedRate:表示任務(wù)之間的時(shí)間間隔,單位是毫秒。
- fixedDelay:表示任務(wù)執(zhí)行完之后,再延遲多少時(shí)間進(jìn)行下次執(zhí)行。
- cron:通過(guò)Cron表達(dá)式定義任務(wù)的具體執(zhí)行時(shí)間。
4. 定時(shí)任務(wù)的配置
定時(shí)任務(wù)的調(diào)度機(jī)制也可以通過(guò)application.properties或application.yml來(lái)進(jìn)行配置,以控制執(zhí)行的間隔時(shí)間、超時(shí)等。
# application.properties配置 spring.task.scheduling.pool.size=5 # 配置線程池大小 spring.task.scheduling.shutdown.await-termination=true # 任務(wù)完成后是否等待線程池的關(guān)閉
?? 方法二:使用Quartz框架
Quartz是一個(gè)功能強(qiáng)大的定時(shí)任務(wù)調(diào)度框架,支持更復(fù)雜的調(diào)度需求,如任務(wù)的持久化、集群調(diào)度和觸發(fā)器管理等。在Spring Boot中,可以通過(guò)spring-boot-starter-quartz來(lái)集成Quartz。
1. 添加依賴
在pom.xml中加入Quartz依賴:
<dependencies>
<!-- Quartz Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>2. Quartz任務(wù)配置
首先,我們需要配置Quartz調(diào)度器,可以在application.properties中配置Quartz相關(guān)參數(shù):
# application.properties配置 spring.quartz.job-store-type=memory # 使用內(nèi)存存儲(chǔ)任務(wù)(也可以使用jdbc) spring.quartz.scheduler.instance-name=MyScheduler spring.quartz.thread-pool.size=10
3. 創(chuàng)建Quartz任務(wù)和調(diào)度器
Quartz的任務(wù)通常需要實(shí)現(xiàn)Job接口,然后通過(guò)Scheduler進(jìn)行調(diào)度。
示例:創(chuàng)建一個(gè)簡(jiǎn)單的Quartz任務(wù)
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
@Component
public class MyQuartzJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Quartz任務(wù)執(zhí)行中... " + System.currentTimeMillis());
}
}示例:調(diào)度任務(wù)
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Autowired
private MyQuartzJob myQuartzJob;
@Bean
public JobDetail jobDetail() {
return JobBuilder.newJob(MyQuartzJob.class)
.withIdentity("myJob")
.storeDurably()
.build();
}
@Bean
public Trigger trigger() {
return TriggerBuilder.newTrigger()
.forJob(jobDetail())
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) // 每分鐘執(zhí)行一次
.build();
}
@Bean
public Scheduler scheduler() throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail(), trigger());
return scheduler;
}
}- JobDetail:定義了任務(wù)的具體內(nèi)容。
- Trigger:定義任務(wù)的觸發(fā)器,在此配置了一個(gè)Cron觸發(fā)器,使任務(wù)每分鐘執(zhí)行一次。
4. Quartz的高級(jí)功能
Quartz還支持一些高級(jí)功能,包括:
- 任務(wù)持久化:通過(guò)數(shù)據(jù)庫(kù)存儲(chǔ)任務(wù)狀態(tài),支持任務(wù)的恢復(fù)。
- 集群調(diào)度:在多個(gè)Quartz實(shí)例間分配任務(wù)。
- 復(fù)雜的Cron表達(dá)式:支持靈活的調(diào)度規(guī)則。
5. 使用Quartz的高級(jí)調(diào)度功能
Quartz能夠處理更復(fù)雜的任務(wù)調(diào)度需求。例如,可以在不同的時(shí)間點(diǎn)觸發(fā)不同的任務(wù),或者在某些條件滿足時(shí)自動(dòng)啟動(dòng)任務(wù)。
// 例如,創(chuàng)建一個(gè)復(fù)雜的Cron表達(dá)式任務(wù),控制任務(wù)的執(zhí)行時(shí)間
@Scheduled(cron = "0 0 8 * * ?") // 每天8點(diǎn)執(zhí)行
public void runComplexTask() {
System.out.println("執(zhí)行復(fù)雜調(diào)度任務(wù)!");
}? 總結(jié):Spring Boot中的定時(shí)任務(wù)與調(diào)度
在Spring Boot中,定時(shí)任務(wù)和調(diào)度非常容易實(shí)現(xiàn)。通過(guò)@Scheduled注解,我們可以快速實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù),滿足常見(jiàn)的周期性任務(wù)需求。而Quartz則是一個(gè)功能更強(qiáng)大的調(diào)度框架,適用于更復(fù)雜的任務(wù)調(diào)度需求,支持任務(wù)持久化、集群調(diào)度等功能。
關(guān)鍵點(diǎn):
- @Scheduled:適合簡(jiǎn)單的定時(shí)任務(wù),支持
fixedRate、fixedDelay和cron等多種方式。 - Quartz:適用于復(fù)雜的調(diào)度任務(wù),支持任務(wù)的持久化、集群調(diào)度和靈活的Cron表達(dá)式。
- 調(diào)度配置:通過(guò)
application.properties來(lái)配置調(diào)度相關(guān)的參數(shù),如線程池大小、任務(wù)超時(shí)等。
通過(guò)Spring Boot的定時(shí)任務(wù)和Quartz集成,我們能夠有效地管理任務(wù)調(diào)度,確保系統(tǒng)的穩(wěn)定性和可維護(hù)性。
到此這篇關(guān)于Spring Boot中使用@Scheduled和Quartz實(shí)現(xiàn)定時(shí)任務(wù)的詳細(xì)過(guò)程的文章就介紹到這了,更多相關(guān)Spring Boot定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中@Scheduled實(shí)現(xiàn)服務(wù)啟動(dòng)時(shí)執(zhí)行一次
- 如何解決SpringBoot定時(shí)任務(wù)報(bào)錯(cuò)Unexpected error occurred in scheduled task問(wèn)題
- Springboot中@scheduled注解解析
- SpringBoot集成quartz實(shí)現(xiàn)定時(shí)任務(wù)
- Springboot整合quartz實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)實(shí)例
- 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ù)框架的完整步驟
相關(guān)文章
淺談SpringCloud實(shí)現(xiàn)簡(jiǎn)單的微服務(wù)架構(gòu)
Spring Cloud是一系列框架的有序集合,本文就使用SpringCloud實(shí)現(xiàn)一套簡(jiǎn)單的微服務(wù)架構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
druid監(jiān)控?zé)o法關(guān)閉的坑以及處理方式
這篇文章主要介紹了druid監(jiān)控?zé)o法關(guān)閉的坑以及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
spring boot多數(shù)據(jù)源動(dòng)態(tài)切換代碼實(shí)例
這篇文章主要介紹了spring boot多數(shù)據(jù)源動(dòng)態(tài)切換代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
深入淺析ArrayList 和 LinkedList的執(zhí)行效率比較
這篇文章主要介紹了ArrayList 和 LinkedList的執(zhí)行效率比較的相關(guān)資料,需要的朋友可以參考下2017-08-08
jdk同時(shí)安裝多個(gè)版本并自由切換的技巧總結(jié)
在我們開(kāi)發(fā)過(guò)程有時(shí)候?yàn)榱肆私獠煌姹緅dk的框架源碼,這時(shí)候我們需要安裝不同版本的JDK來(lái)滿足我們開(kāi)發(fā)的需求,這篇文章主要介紹了jdk同時(shí)安裝多個(gè)版本并自由切換技巧的相關(guān)資料,需要的朋友可以參考下2025-07-07

