SpringBoot定時任務(wù)@Scheduled使用方式
在平時開發(fā)中,需求中經(jīng)常會出現(xiàn)一些定時周期任務(wù),我們可以是用java定時線程ScheduledExecutorService或定時器Timer去實(shí)現(xiàn),而在SpringBoot中,定時任務(wù)十分簡單,只需要新建一個定時任務(wù)類,使用@EnableScheduling開啟定時任務(wù),并在對應(yīng)方法上添加注解@Scheduled即可,其實(shí)它的底層也是通過定時線springframework.scheduling.concurrent.ThreadPoolTaskScheduler去實(shí)現(xiàn)的
一、@Scheduled注解參數(shù)
1、corn
該參數(shù)接收一個cron表達(dá)式,cron表達(dá)式是一個字符串,字符串以5或6個空格隔開,分開共6或7個域,每一個域代表一個含義。用來表示任務(wù)執(zhí)行的時機(jī)及周期
注:[年]不是必須的域,可以省略[年],則一共6個域
語法
[秒] [分] [小時] [日] [月] [周] [年]
| 序號 | 說明 | 是否必填 | 允許填寫的值 | 允許的通配符 |
|---|---|---|---|---|
| 1 | 秒 | 是 | 0-59 | , - * / |
| 2 | 分 | 是 | 0-59 | , - * / |
| 3 | 時 | 是 | 0-23 | , - * / |
| 4 | 日 | 是 | 1-31 | , - * ? / L W |
| 5 | 月 | 是 | 1-12 或 JAN-DEC | , - * / |
| 6 | 周 | 是 | 1-7 或 SUN-SAT | , - * ? / L # |
| 7 | 年 | 是 | 1970-2099 | , - * / |
通配符
| 通配符 | 描述 | 示例 |
|---|---|---|
| * | 表示所有值 | 例如:在分的字段上設(shè)置 *,表示每一分鐘都會觸發(fā)。 |
| ? | 表示不指定值 | 使用的場景為不需要關(guān)心當(dāng)前設(shè)置這個字段的值。例如:要在每月的10號觸發(fā)一個操作,但不關(guān)心是周幾,所以需要周位置的那個字段設(shè)置為”?”, 具體設(shè)置為 0 0 0 10 * ? |
| - | 表示區(qū)間 | 例如:在小時上設(shè)置 “10-12”,表示 10,11,12點(diǎn)都會觸發(fā)。 |
| , | 表示指定多個值 | 例如:在周字段上設(shè)置 “MON,WED,FRI” 表示周一,周三和周五觸發(fā)。 |
| / | 用于遞增觸發(fā) | 如在秒上面設(shè)置”5/15” 表示從5秒開始,每增15秒觸發(fā)(5,20,35,50)。 在日字段上設(shè)置’1/3’所示每月1號開始,每隔三天觸發(fā)一次 |
| L | 表示最后的意思 | 在日字段設(shè)置上,表示當(dāng)月的最后一天(依據(jù)當(dāng)前月份,如果是二月還會依據(jù)是否是潤年[leap]), 在周字段上表示星期六,相當(dāng)于”7”或”SAT”。如果在”L”前加上數(shù)字,則表示該數(shù)據(jù)的最后一個。例如在周字段上設(shè)置”6L”這樣的格式,則表示“本月最后一個星期五” |
| W | 表示離指定日期的最近那個工作日(周一至周五) | 例如在日字段上置”15W”,表示離每月15號最近的那個工作日觸發(fā)。如果15號正好是周六,則找最近的周五(14號)觸發(fā), 如果15號是周未,則找最近的下周一(16號)觸發(fā).如果15號正好在工作日(周一至周五),則就在該天觸發(fā)。如果指定格式為 “1W”,它則表示每月1號往后最近的工作日觸發(fā)。如果1號正是周六,則將在3號下周一觸發(fā)。(注,”W”前只能設(shè)置具體的數(shù)字,不允許區(qū)間”-“)。 |
| # | 序號(表示每月的第幾個周幾), | 例如在周字段上設(shè)置”6#3”表示在每月的第三個周六.注意如果指定”#5”,正好第五周沒有周六,則不會觸發(fā)該配置(用在母親節(jié)和父親節(jié)再合適不過了) ;小提示:’L’和 ‘W’可以一組合使用。如果在日字段上設(shè)置”LW”,則表示在本月的最后一個工作日觸發(fā);周字段的設(shè)置,若使用英文字母是不區(qū)分大小寫的,即MON與mon相同 |
示例
| 描述 | corn表達(dá)式 |
|---|---|
| 每隔10秒執(zhí)行一次 | */10 * * * * ? |
| 每小時30,45分鐘各執(zhí)行一次 | 0 30,45 * * * ? |
| 每周周一的凌晨2點(diǎn)半執(zhí)行一次 | 0 30 2 ? * MON |
| 每天的下午1點(diǎn)開始,每隔5min執(zhí)行一次 | 0 0/5 13 * * ? |
2、zone
時區(qū),cron表達(dá)式會基于該時區(qū)解析。
缺省取服務(wù)器所在地的時區(qū)。比如我們一般使用的時區(qū)Asia/Shanghai
3、fixedDelay
上一次執(zhí)行完畢之后多長時間再執(zhí)行
@Scheduled(fixedRate = 5000) // 上次執(zhí)行后再過5s執(zhí)行
4、fixedDelayString
與 fixedDelay 意思相同,只是使用字符串的形式,唯一不同的是支持占位符
@Scheduled(fixedDelayString = "5000")
5、fixedRate
周期,多久執(zhí)行一次
@Scheduled(fixedRate = 5000) // 每5s執(zhí)行一次
6、fixedRateString
與 fixedRate意思相同,只是使用字符串的形式,支持占位符
7、initialDelay
第一次執(zhí)行延遲時間
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延遲1秒后執(zhí)行,之后按fixedRate的規(guī)則每5秒執(zhí)行一次
8. initialDelayString
與initialDelay 意思相同,只是使用字符串的形式,支持占位符。
二、示例
注意在類上加上@Configuration或@Component注解
1、示例1
@Slf4j
@EnableScheduling // 開啟定時任務(wù)
@Configuration // 此注解必須加,不加不會掃描到定時任務(wù),也可使用@Component
public class ScheduleTask {
@Scheduled(initialDelay = 3000, fixedRateString = "5000") // 首次延遲3秒后執(zhí)行,后邊每5s一次
private void scheduleTask1() {
log.info("method = scheduleTask1, schedule time is {}", System.currentTimeMillis());
}
@Scheduled(fixedDelay = 5000) // 如果是服務(wù)啟動就開始執(zhí)行的任務(wù),和fixedRate就意義相同了
private void scheduleTask2() {
log.info("method = scheduleTask2, schedule time is {}", System.currentTimeMillis());
}
@Scheduled(cron = "*/10 * * * * ?") // 每隔十秒執(zhí)行一次
private void scheduleTask3() {
log.info("method = scheduleTask3, schedule time is {}", System.currentTimeMillis());
}
@Scheduled(cron = "0 50,55 * * * ?") // 每小時的50和55各執(zhí)行一次
private void scheduleTask4() {
log.info("method = scheduleTask4, schedule time is {}", System.currentTimeMillis());
}
}
結(jié)果
從日志可以看出服務(wù)啟動后scheduleTask2先執(zhí)行的,3s后scheduleTask1開始執(zhí)行,后續(xù)都是每5s執(zhí)行一次,scheduleTask3是每10s執(zhí)行一次
12:48:24.316 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask2, schedule time is 1594356504316 12:48:27.318 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask1, schedule time is 1594356507318 12:48:29.319 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask2, schedule time is 1594356509319 12:48:30.001 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask3, schedule time is 1594356510001 12:48:32.317 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask1, schedule time is 1594356512317 12:48:34.320 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask2, schedule time is 1594356514320 12:48:37.317 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask1, schedule time is 1594356517317 12:48:39.323 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask2, schedule time is 1594356519323 12:48:40.001 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask3, schedule time is 1594356520001
scheduleTask4 50和55分各執(zhí)行了一次
12:50:00.001 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask4, schedule time is 1594356600001 12:55:00.002 [scheduling-1] INFO com.spring.demo.service.impl.ScheduleTask - method = scheduleTask4, schedule time is 1594356900002
2、示例2
從某個時刻開始任務(wù),每間隔多長時間來觸發(fā)一次
@Slf4j
@EnableScheduling
@Configuration
public class ScheduleTask {
private int count = 0;
@Scheduled(cron = "0 0/1 13 * * ?") // 每天下午1點(diǎn)開始,每1min執(zhí)行一次
private void scheduleTask() {
log.info("execute 第{}次 scheduleTask", ++count);
}

總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
springBoot靜態(tài)資源加載不到,并且配置了也不生效問題及解決
這篇文章總結(jié)了一個在Spring Boot 2.6.x版本中,由于路徑匹配策略改變導(dǎo)致靜態(tài)資源無法加載的問題,并提供了解決方案:通過配置類或在配置文件中設(shè)置路徑匹配策略為AntPathMatcher,或者直接降級Spring Boot版本2025-02-02
Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解
這篇文章主要介紹了Java強(qiáng)制保留兩位小數(shù)的四種方法案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
深入淺出探究Java多態(tài)的實(shí)現(xiàn)和應(yīng)用
多態(tài)是實(shí)現(xiàn)面向?qū)ο蟮能浖夹g(shù)中必不可少的一個內(nèi)容,所以這篇文章主要來和大家講解一下Java多態(tài)的實(shí)現(xiàn)和應(yīng)用,感興趣的小伙伴可以了解一下2023-07-07
解決springboot中自定義JavaBean返回的json對象屬性名稱大寫變小寫問題
開發(fā)過程中發(fā)現(xiàn)查詢返回的數(shù)據(jù)出現(xiàn)自定義的JavaBean的屬性值大小寫格式出現(xiàn)問題,導(dǎo)致前端無法接受到數(shù)據(jù),目前有四種解決方法,根據(jù)大佬的經(jīng)驗(yàn)之談,前兩種是最簡單便捷的,后兩種是比較通用的方法,需要的朋友可以參考下2023-10-10
spring mvc中@PathVariable / 帶斜杠方式獲取
這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

