Spring 定時(shí)任務(wù)@Scheduled 注解四大參數(shù)用法解析
本文主要介紹了在 Spring 框架中使用@Scheduled注解實(shí)現(xiàn)定時(shí)任務(wù)的方法,重點(diǎn)講解了fixedRate、fixedDelay、cron和initialDelay這四個(gè)參數(shù)的用法,并通過(guò)實(shí)例代碼進(jìn)行了詳細(xì)說(shuō)明。
1. fixedRate 參數(shù)
參數(shù)含義
fixedRate
指定任務(wù)固定時(shí)間間隔執(zhí)行。如設(shè)為 3000 毫秒(3 秒),第一次任務(wù)啟動(dòng)后,后續(xù)任務(wù)每隔 3 秒嘗試啟動(dòng),不考慮前次任務(wù)是否完成。
示例代碼
創(chuàng)建一個(gè)簡(jiǎn)單的 Spring Boot 項(xiàng)目,并在主類上添加@SpringBootApplication
注解以啟用 Spring Boot 自動(dòng)配置。
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling // 啟用定時(shí)任務(wù)功能 public class ScheduledDemoApplication { public static void main(String[] args) { SpringApplication.run(ScheduledDemoApplication.class, args); } }
創(chuàng)建一個(gè)定時(shí)任務(wù)類,doTask
方法被@Scheduled
注解修飾,fixedRate
設(shè)置為 3000 毫秒。在方法內(nèi)部,我們首先打印出執(zhí)行次數(shù)和當(dāng)前時(shí)間,然后通過(guò)Thread.sleep
模擬任務(wù)執(zhí)行耗時(shí) 5 秒。運(yùn)行應(yīng)用程序后,你會(huì)發(fā)現(xiàn)盡管任務(wù)執(zhí)行時(shí)間超過(guò)了 3 秒,但每隔 3 秒就會(huì)有一次新的任務(wù)嘗試啟動(dòng),導(dǎo)致任務(wù)會(huì)重疊執(zhí)行。
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class FixedRateTask { private int count = 0; @Scheduled(fixedRate = 3000) public void doTask() { System.out.println("FixedRateTask - 執(zhí)行次數(shù): " + (++count) + ",當(dāng)前時(shí)間: " + System.currentTimeMillis()); try { // 模擬任務(wù)執(zhí)行耗時(shí) 5 秒 Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }
2. fixedDelay 參數(shù)
參數(shù)含義
與fixedRate
不同,fixedDelay
參數(shù)關(guān)注的是上一次任務(wù)執(zhí)行完成后的延遲時(shí)間。也就是說(shuō),只有當(dāng)上一次任務(wù)徹底結(jié)束后,才會(huì)開(kāi)始計(jì)算固定的延遲時(shí)間,之后才啟動(dòng)下一次任務(wù)。例如,設(shè)置fixedDelay = 3000
毫秒,那么在上一次任務(wù)完成后,會(huì)等待 3 秒才開(kāi)始下一次任務(wù)。
示例代碼
創(chuàng)建一個(gè)FixedDelayTask
類,doTask
方法的fixedDelay
設(shè)置為 3000 毫秒,任務(wù)模擬執(zhí)行耗時(shí) 2 秒。運(yùn)行后可以看到,每次任務(wù)執(zhí)行完成后,會(huì)等待 3 秒才開(kāi)始下一次任務(wù),任務(wù)不會(huì)重疊執(zhí)行。
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class FixedDelayTask { private int count = 0; @Scheduled(fixedDelay = 3000) public void doTask() { System.out.println("FixedDelayTask - 執(zhí)行次數(shù): " + (++count) + ",當(dāng)前時(shí)間: " + System.currentTimeMillis()); try { // 模擬任務(wù)執(zhí)行耗時(shí) 2 秒 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } }
3. cron 參數(shù)
參數(shù)含義
cron
參數(shù)提供了一種高度靈活的定時(shí)任務(wù)執(zhí)行時(shí)間設(shè)置方式。它基于 cron 表達(dá)式,該表達(dá)式由 6 個(gè)或 7 個(gè)字段組成,分別對(duì)應(yīng)秒、分鐘、小時(shí)、日、月、星期(星期可以用數(shù)字 0 - 6 表示,其中 0 或 7 代表星期日)以及可選的年。通過(guò)合理組合這些字段的值,可以精確地定義任務(wù)在何時(shí)執(zhí)行。
示例代碼
創(chuàng)建一個(gè)CronTask
類,cron
表達(dá)式"0 0/5 * * * *"
表示每隔 5 分鐘執(zhí)行一次任務(wù)。例如,任務(wù)可能在 10:00:00、10:05:00、10:10:00 等時(shí)間點(diǎn)執(zhí)行。:
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class CronTask { @Scheduled(cron = "0 0/5 * * * *") public void doTask() { System.out.println("CronTask - 執(zhí)行時(shí)間: " + System.currentTimeMillis()); } }
4. initialDelay 參數(shù)
參數(shù)含義
initialDelay
參數(shù)用于指定定時(shí)任務(wù)在應(yīng)用啟動(dòng)后首次執(zhí)行的延遲時(shí)間。它可以與fixedRate
、fixedDelay
或cron
等參數(shù)結(jié)合使用,以便在應(yīng)用啟動(dòng)后等待一段時(shí)間再開(kāi)始執(zhí)行定時(shí)任務(wù)。
示例代碼
創(chuàng)建一個(gè)InitialDelayTask
類,、fixedRate
設(shè)置為 3000 毫秒,initialDelay
設(shè)置為 5000 毫秒。這意味著應(yīng)用啟動(dòng)后,會(huì)先等待 5 秒,然后才開(kāi)始按照每 3 秒的固定間隔執(zhí)行任務(wù)。
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class InitialDelayTask { private int count = 0; @Scheduled(fixedRate = 3000, initialDelay = 5000) public void doTask() { System.out.println("InitialDelayTask - 執(zhí)行次數(shù): " + (++count) + ",當(dāng)前時(shí)間: " + System.currentTimeMillis()); } }
5. 總結(jié)
- 對(duì)于一些對(duì)實(shí)時(shí)性要求較高且執(zhí)行時(shí)間較短的任務(wù),可以考慮使用
fixedRate
; - 對(duì)于執(zhí)行時(shí)間較長(zhǎng)且不希望任務(wù)重疊的任務(wù),
fixedDelay
可能更為合適; - 對(duì)于需要在特定時(shí)間點(diǎn)或按照復(fù)雜時(shí)間規(guī)則執(zhí)行的任務(wù),
cron
表達(dá)式則是不二之選。 initialDelay
參數(shù)可以幫助我們更好地控制任務(wù)的啟動(dòng)時(shí)間,避免在應(yīng)用啟動(dòng)初期因大量任務(wù)同時(shí)啟動(dòng)而帶來(lái)的性能壓力。
到此這篇關(guān)于Spring 定時(shí)任務(wù)@Scheduled 注解四大參數(shù)解析的文章就介紹到這了,更多相關(guān)Spring 定時(shí)任務(wù)@Scheduled 注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring自帶定時(shí)任務(wù)@Scheduled注解實(shí)例講解
- Spring定時(shí)任務(wù)@scheduled多線程使用@Async注解示例
- Spring定時(shí)任務(wù)@Scheduled注解(cron表達(dá)式fixedRate?fixedDelay)
- Spring 定時(shí)任務(wù)@Scheduled 注解中的 Cron 表達(dá)式詳解
- SpringBoot中定時(shí)任務(wù)@Scheduled注解的使用解讀
- spring-boot通過(guò)@Scheduled配置定時(shí)任務(wù)及定時(shí)任務(wù)@Scheduled注解的方法
相關(guān)文章
SpringCloud中NacosNamingService的作用詳解
這篇文章主要介紹了SpringCloud中NacosNamingService的作用詳解,NacosNamingService類完成服務(wù)實(shí)例注冊(cè),撤銷與獲取服務(wù)實(shí)例操作,NacosNamingService初始化采用單例模式,使用反射生成,需要的朋友可以參考下2023-11-11分布式難題ElasticSearch解決大數(shù)據(jù)量檢索面試
這篇文章主要為大家介紹了分布式面試難題,ElasticSearch解決大數(shù)據(jù)量檢索的問(wèn)題分析回答,讓面試官無(wú)話可說(shuō),幫助大家實(shí)現(xiàn)面試開(kāi)薪自由2022-03-03關(guān)于Spring配置文件加載方式變化引發(fā)的異常詳解
這篇文章主要給大家介紹了關(guān)于Spring配置文件加載方式變化引發(fā)的異常的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01