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

