@Scheduled注解的使用之SpringBoot-Springtask介紹
@Scheduled 注解是 Spring 框架中用于定時(shí)任務(wù)調(diào)度的核心注解之一。通過 @Scheduled 注解,開發(fā)者可以非常方便地在 Spring 應(yīng)用程序中定義和配置各種定時(shí)任務(wù),包括固定速率執(zhí)行、固定延遲執(zhí)行、cron 表達(dá)式執(zhí)行等。
本文將詳細(xì)講解 @Scheduled 注解的各個(gè)方面,包括其屬性、使用方法、配置方式以及一些最佳實(shí)踐。
基本概念
@Scheduled 注解用于標(biāo)記一個(gè)方法,使其成為一個(gè)定時(shí)任務(wù),按照指定的時(shí)間規(guī)則自動(dòng)執(zhí)行。被 @Scheduled 注解標(biāo)記的方法必須是 void 返回類型,并且不能接受任何參數(shù)。
屬性詳解
@Scheduled 注解提供了多個(gè)屬性,用于定義任務(wù)的執(zhí)行規(guī)則:
fixedRate:
- 類型:
long - 描述:以毫秒為單位,定義任務(wù)兩次執(zhí)行之間的固定時(shí)間間隔。任務(wù)會(huì)以固定的時(shí)間間隔執(zhí)行,即使前一次任務(wù)的執(zhí)行時(shí)間超過了這個(gè)間隔。
- 示例:
@Scheduled(fixedRate = 5000)表示任務(wù)每 5 秒執(zhí)行一次。
fixedDelay:
- 類型:
long - 描述:以毫秒為單位,定義任務(wù)兩次執(zhí)行之間的固定延遲時(shí)間。任務(wù)會(huì)在前一次執(zhí)行完成后,等待指定的延遲時(shí)間后再執(zhí)行下一次。
- 示例:
@Scheduled(fixedDelay = 5000)表示任務(wù)在前一次執(zhí)行完成后,等待 5 秒再執(zhí)行下一次。
initialDelay:
- 類型:
long - 描述:以毫秒為單位,定義任務(wù)首次執(zhí)行前的初始延遲時(shí)間。任務(wù)會(huì)在應(yīng)用程序啟動(dòng)后,等待指定的初始延遲時(shí)間后再首次執(zhí)行。
- 示例:
@Scheduled(fixedRate = 5000, initialDelay = 1000)表示任務(wù)在應(yīng)用程序啟動(dòng)后等待 1 秒,然后每 5 秒執(zhí)行一次。
cron:
- 類型:
String - 描述:使用 cron 表達(dá)式定義任務(wù)的執(zhí)行時(shí)間規(guī)則。cron 表達(dá)式非常靈活,可以定義復(fù)雜的執(zhí)行時(shí)間規(guī)則。
- 示例:
@Scheduled(cron = "0 0 12 * * ?")表示任務(wù)每天中午 12 點(diǎn)執(zhí)行。
zone:
- 類型:
String - 描述:定義 cron 表達(dá)式使用的時(shí)區(qū)。默認(rèn)情況下,使用服務(wù)器的本地時(shí)區(qū)。
- 示例:
@Scheduled(cron = "0 0 12 * * ?", zone = "GMT")表示任務(wù)每天中午 12 點(diǎn)在 GMT 時(shí)區(qū)執(zhí)行。
使用方法
要使用 @Scheduled 注解,首先需要在 Spring 配置類上啟用任務(wù)調(diào)度功能,可以通過 @EnableScheduling 注解來實(shí)現(xiàn):
@Configuration
@EnableScheduling
public class SchedulingConfig {
}
然后,在需要定時(shí)執(zhí)行的方法上添加 @Scheduled 注解,并配置相應(yīng)的屬性:
@Component
public class ScheduledTasks {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
@Scheduled(fixedRate = 5000)
public void runTaskAtFixedRate() {
logger.info("Fixed rate task - {}", System.currentTimeMillis());
}
@Scheduled(fixedDelay = 5000)
public void runTaskAtFixedDelay() {
logger.info("Fixed delay task - {}", System.currentTimeMillis());
}
@Scheduled(initialDelay = 1000, fixedRate = 5000)
public void runTaskWithInitialDelay() {
logger.info("Task with initial delay - {}", System.currentTimeMillis());
}
@Scheduled(cron = "0 0 12 * * ?")
public void runTaskAtNoon() {
logger.info("Noon task - {}", System.currentTimeMillis());
}
}
配置方式
除了在方法上直接使用 @Scheduled 注解外,還可以通過配置文件(如 XML 或 properties 文件)來定義定時(shí)任務(wù)的執(zhí)行規(guī)則。這種方式適用于需要?jiǎng)討B(tài)配置任務(wù)執(zhí)行規(guī)則的場(chǎng)景。
XML 配置
在 Spring 的 XML 配置文件中,可以通過 <task:scheduled-tasks> 標(biāo)簽來配置定時(shí)任務(wù):
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="scheduledTasks" method="runTaskAtFixedRate" fixed-rate="5000"/>
<task:scheduled ref="scheduledTasks" method="runTaskAtFixedDelay" fixed-delay="5000"/>
<task:scheduled ref="scheduledTasks" method="runTaskWithInitialDelay" initial-delay="1000" fixed-rate="5000"/>
<task:scheduled ref="scheduledTasks" method="runTaskAtNoon" cron="0 0 12 * * ?"/>
</task:scheduled-tasks>
<task:scheduler id="scheduler" pool-size="10"/>
Properties 配置
在 Spring Boot 應(yīng)用程序中,可以通過 application.properties 文件來配置定時(shí)任務(wù)的執(zhí)行規(guī)則:
# 定義定時(shí)任務(wù)的執(zhí)行規(guī)則 scheduled.task.fixedRate=5000 scheduled.task.fixedDelay=5000 scheduled.task.initialDelay=1000 scheduled.task.cron=0 0 12 * * ?
然后在代碼中使用 @Value 注解來讀取這些配置:
@Component
public class ScheduledTasks {
private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);
@Value("${scheduled.task.fixedRate}")
private long fixedRate;
@Value("${scheduled.task.fixedDelay}")
private long fixedDelay;
@Value("${scheduled.task.initialDelay}")
private long initialDelay;
@Value("${scheduled.task.cron}")
private String cron;
@Scheduled(fixedRateString = "${scheduled.task.fixedRate}")
public void runTaskAtFixedRate() {
logger.info("Fixed rate task - {}", System.currentTimeMillis());
}
@Scheduled(fixedDelayString = "${scheduled.task.fixedDelay}")
public void runTaskAtFixedDelay() {
logger.info("Fixed delay task - {}", System.currentTimeMillis());
}
@Scheduled(initialDelayString = "${scheduled.task.initialDelay}", fixedRateString = "${scheduled.task.fixedRate}")
public void runTaskWithInitialDelay() {
logger.info("Task with initial delay - {}", System.currentTimeMillis());
}
@Scheduled(cron = "${scheduled.task.cron}")
public void runTaskAtNoon() {
logger.info("Noon task - {}", System.currentTimeMillis());
}
}
最佳實(shí)踐
在使用 @Scheduled 注解時(shí),以下是一些最佳實(shí)踐:
- 合理選擇執(zhí)行規(guī)則:根據(jù)任務(wù)的性質(zhì)和需求,合理選擇
fixedRate、fixedDelay或cron表達(dá)式來定義任務(wù)的執(zhí)行規(guī)則。 - 避免長(zhǎng)時(shí)間任務(wù):盡量避免在定時(shí)任務(wù)中執(zhí)行長(zhǎng)時(shí)間運(yùn)行的操作,以免影響其他任務(wù)的執(zhí)行。
- 異常處理:在定時(shí)任務(wù)中添加適當(dāng)?shù)漠惓L幚磉壿?,以避免任?wù)執(zhí)行失敗導(dǎo)致系統(tǒng)不穩(wěn)定。
- 監(jiān)控和日志:對(duì)定時(shí)任務(wù)的執(zhí)行情況進(jìn)行監(jiān)控和日志記錄,以便及時(shí)發(fā)現(xiàn)和解決問題。
- 動(dòng)態(tài)配置:對(duì)于需要?jiǎng)討B(tài)調(diào)整執(zhí)行規(guī)則的任務(wù),可以通過配置文件或外部系統(tǒng)來實(shí)現(xiàn)動(dòng)態(tài)配置。
總結(jié)
@Scheduled 注解是 Spring 框架中非常強(qiáng)大且易用的定時(shí)任務(wù)調(diào)度工具。通過合理配置和使用 @Scheduled 注解,開發(fā)者可以方便地實(shí)現(xiàn)各種定時(shí)任務(wù),提高應(yīng)用程序的自動(dòng)化和響應(yīng)能力。在使用過程中,應(yīng)遵循最佳實(shí)踐,確保任務(wù)的穩(wěn)定執(zhí)行和系統(tǒng)的可靠性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決@CachePut設(shè)置的key值無法與@CacheValue的值匹配問題
這篇文章主要介紹了解決@CachePut設(shè)置的key的值無法與@CacheValue的值匹配問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring MVC請(qǐng)求參數(shù)與響應(yīng)結(jié)果全局加密和解密詳解
這篇文章主要給大家介紹了關(guān)于Spring MVC請(qǐng)求參數(shù)與響應(yīng)結(jié)果全局加密和解密的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Java實(shí)現(xiàn)簡(jiǎn)單GUI登錄和注冊(cè)界面
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單GUI登錄和注冊(cè)界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
詳解SpringBoot 添加對(duì)JSP的支持(附常見坑點(diǎn))
這篇文章主要介紹了詳解SpringBoot 添加對(duì)JSP的支持(附常見坑點(diǎn)),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-10-10
Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解
這篇文章主要介紹了Java 獲取本機(jī)的IP與MAC地址實(shí)現(xiàn)詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
深入淺析java web log4j 配置及在web項(xiàng)目中配置Log4j的技巧
這篇文章主要介紹了2015-11-11

