Spring Boot中使用@Scheduled和Quartz實(shí)現(xiàn)定時(shí)任務(wù)的詳細(xì)過程
- 演示環(huán)境說明:
- 開發(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)用中常見的功能,特別是在需要執(zhí)行周期性任務(wù)的情況下,例如定時(shí)備份數(shù)據(jù)、發(fā)送通知、清理臨時(shí)文件等。在微服務(wù)架構(gòu)、分布式系統(tǒng)以及大規(guī)模應(yīng)用中,定時(shí)任務(wù)的管理變得更加重要。
Spring Boot提供了兩種常見的定時(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ù)。常見的定時(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ù)來定義定時(shí)任務(wù)的執(zhí)行策略:
- fixedRate:每隔固定時(shí)間執(zhí)行任務(wù)(單位:毫秒),無論上一個(gè)任務(wù)是否完成。
- fixedDelay:任務(wù)結(jié)束后延遲一定時(shí)間再執(zhí)行下一次任務(wù)。
- initialDelay:任務(wù)開始執(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秒后開始,每次執(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秒后開始,每次執(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:通過Cron表達(dá)式定義任務(wù)的具體執(zhí)行時(shí)間。
4. 定時(shí)任務(wù)的配置
定時(shí)任務(wù)的調(diào)度機(jī)制也可以通過application.properties或application.yml來進(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中,可以通過spring-boot-starter-quartz來集成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接口,然后通過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ù)持久化:通過數(shù)據(jù)庫存儲(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)。通過@Scheduled注解,我們可以快速實(shí)現(xiàn)簡(jiǎn)單的定時(shí)任務(wù),滿足常見的周期性任務(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)度配置:通過
application.properties來配置調(diào)度相關(guān)的參數(shù),如線程池大小、任務(wù)超時(shí)等。
通過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ā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問題
- 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)文章
springboot項(xiàng)目配置多個(gè)kafka的示例代碼
這篇文章主要介紹了springboot項(xiàng)目配置多個(gè)kafka,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04
Java中BM(Boyer-Moore)算法的圖解與實(shí)現(xiàn)
本文主要介紹了兩個(gè)大的部分,第一部分通過圖解的方式講解BM算法,第二部分則代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)易的BM算法,感興趣的小伙伴可以學(xué)習(xí)一下2022-05-05
Spring中屬性注入的幾種方式以及復(fù)雜屬性的注入詳解
這篇文章主要介紹了Spring中屬性注入的幾種方式以及復(fù)雜屬性的注入詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
詳解如何用Java實(shí)現(xiàn)對(duì)m3u8直播流抽幀
抽幀(frame extraction)是指從視頻流中提取一些特定的幀,通常是關(guān)鍵幀或者隨機(jī)幀,以供后續(xù)處理。這篇文章主要為大家介紹了如何用Java實(shí)現(xiàn)對(duì)m3u8直播流抽幀,需要的可以參考一下2023-03-03
java通過客戶端訪問服務(wù)器webservice的方法
這篇文章主要介紹了java通過客戶端訪問服務(wù)器webservice的方法,涉及java創(chuàng)建與調(diào)用webservice的相關(guān)技巧,需要的朋友可以參考下2016-08-08
Java計(jì)算器核心算法代碼實(shí)現(xiàn)
今天小編就為大家分享一篇關(guān)于Java計(jì)算器核心算法代碼實(shí)現(xiàn),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01
SpringCloud Feign遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解
Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非常基礎(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似2022-11-11

