Spring Schedule是Spring提供的定時(shí)任務(wù)框架一膨,相較于Quartz缓溅,Schedule更加簡(jiǎn)單易用,在中小型應(yīng)用中,對(duì)于大部分需求,Schedule都可以勝任镇防。
一、Spring Schedule使用演示
在SpringBoot使用Spring Schedule非常簡(jiǎn)單涣狗,因?yàn)镾pringBoot自身的starter中已經(jīng)集成了Schedule谍婉,而不需要我們做更多的處理。
使用@EnableScheduling注解開啟定時(shí)功能屑柔,該注解可以使用在啟動(dòng)類上屡萤,也可以注解于定時(shí)任務(wù)的類上。然后使用@Scheduled注解配合其參數(shù)完成定時(shí)任務(wù)掸宛。
例如我們需要每一秒執(zhí)行一次的任務(wù)死陆, 寫成@Scheduled(fixedRate = 1000)即可。
@EnableScheduling
@Component
public class Task {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 1000)
public void taskOne(){
System.out.println("現(xiàn)在時(shí)間:" + dateFormat.format(new Date()));
}
}
啟動(dòng)程序唧瘾,該定時(shí)就可以間隔一秒持續(xù)執(zhí)行了措译。
使用Spring Schedule就是這么簡(jiǎn)單,如果有更多其他的需求饰序,配合@Scheduled的其他參數(shù)领虹,基本也可以實(shí)現(xiàn)。
一求豫、@Scheduled參數(shù)詳解
cron
支持傳入cron表達(dá)式:[秒] [分] [小時(shí)] [日] [月] [周] [年]塌衰,[年]不是必須的域,可以省略[年]蝠嘉,則一共6個(gè)域最疆。
位置 | 說(shuō)明 | 必填 | 允許填寫的值 | 允許的通配符 |
---|---|---|---|---|
1 | 秒 | 是 | 0-59 | - * / |
2 | 分 | 是 | 0-59 | - * / |
3 | 時(shí) | 是 | 0-23 | - * / |
4 | 日 | 是 | 1-31 | - * ? / L W |
5 | 月 | 是 | 1-12 or JAN-DEC | - * / |
6 | 周 | 是 | 1-7 or SUN-SAT | - * ? / L # |
7 | 年 | 否 | 1970-2099 | - * / |
- * 表示所有值。 例如:在分的字段上設(shè)置 *,表示每一分鐘都會(huì)觸發(fā)蚤告。
- ? 表示不指定值努酸。使用的場(chǎng)景為不需要關(guān)心當(dāng)前設(shè)置這個(gè)字段的值。例如:要在每月的10號(hào)觸發(fā)一個(gè)操作杜恰,但不關(guān)心是周幾获诈,所以需要周位置的那個(gè)字段設(shè)置為”?” 具體設(shè)置為 0 0 0 10 * ?
- - 表示區(qū)間。例如 在小時(shí)上設(shè)置 “10-12”,表示 10,11,12點(diǎn)都會(huì)觸發(fā)心褐。
- , 表示指定多個(gè)值舔涎,例如在周字段上設(shè)置 “MON,WED,FRI” 表示周一,周三和周五觸發(fā)/ 用于遞增觸發(fā)檬寂。如在秒上面設(shè)置”5/15” 表示從5秒開始终抽,每增15秒觸發(fā)(5,20,35,50)。 在月字段上設(shè)置’1/3’所示每月1號(hào)開始桶至,每隔三天觸發(fā)一次。
- L 表示最后的意思匾旭。在日字段設(shè)置上镣屹,表示當(dāng)月的最后一天(依據(jù)當(dāng)前月份,如果是二月還會(huì)依據(jù)是否是潤(rùn)年[leap]), 在周字段上表示星期六价涝,相當(dāng)于”7”或”SAT”女蜈。如果在”L”前加上數(shù)字,則表示該數(shù)據(jù)的最后一個(gè)。例如在周字段上設(shè)置”6L”這樣的格式,則表示“本月最后一個(gè)星期五”
- W 表示離指定日期的最近那個(gè)工作日(周一至周五). 例如在日字段上置”15W”伪窖,表示離每月15號(hào)最近的那個(gè)工作日觸發(fā)逸寓。如果15號(hào)正好是周六,則找最近的周五(14號(hào))觸發(fā), 如果15號(hào)是周未覆山,則找最近的下周一(16號(hào))觸發(fā).如果15號(hào)正好在工作日(周一至周五)竹伸,則就在該天觸發(fā)。如果指定格式為 “1W”,它則表示每月1號(hào)往后最近的工作日觸發(fā)簇宽。如果1號(hào)正是周六勋篓,則將在3號(hào)下周一觸發(fā)。(注魏割,”W”前只能設(shè)置具體的數(shù)字,不允許區(qū)間”-“)譬嚣。
- # 序號(hào)(表示每月的第幾個(gè)周幾),例如在周字段上設(shè)置”6#3”表示在每月的第三個(gè)周六.注意如果指定”#5”,正好第五周沒(méi)有周六钞它,則不會(huì)觸發(fā)該配置(用在母親節(jié)和父親節(jié)再合適不過(guò)了) 拜银;小提示:’L’和 ‘W’可以一組合使用。如果在日字段上設(shè)置”LW”,則表示在本月的最后一個(gè)工作日觸發(fā)遭垛;周字段的設(shè)置尼桶,若使用英文字母是不區(qū)分大小寫的,即MON與mon相同耻卡。
示例
- 每隔5秒執(zhí)行一次:*/5 * * * * ?
- 每隔1分鐘執(zhí)行一次:0 */1 * * * ?
- 每天23點(diǎn)執(zhí)行一次:0 0 23 * * ?
- 每天凌晨1點(diǎn)執(zhí)行一次:0 0 1 * * ?
- 每月1號(hào)凌晨1點(diǎn)執(zhí)行一次:0 0 1 1 * ?
- 每月最后一天23點(diǎn)執(zhí)行一次:0 0 23 L * ?
- 每周星期天凌晨1點(diǎn)實(shí)行一次:0 0 1 ? * L
- 在26分疯汁、29分、33分執(zhí)行一次:0 26,29,33 * * * ?
- 每天的0點(diǎn)卵酪、13點(diǎn)幌蚊、18點(diǎn)、21點(diǎn)都執(zhí)行一次:0 0 0,13,18,21 * * ?
zone
表示時(shí)區(qū)溃卡,接收一個(gè)java.util.TimeZone#ID溢豆。cron表達(dá)式會(huì)基于該時(shí)區(qū)解析。默認(rèn)是一個(gè)空字符串瘸羡,即取服務(wù)器所在地的時(shí)區(qū)漩仙。
fixedDelay
上一次執(zhí)行完畢時(shí)間點(diǎn)之后多長(zhǎng)時(shí)間再執(zhí)行。
fixedDelayString
與fixedDelay類似犹赖,傳入字符串队他,也可支持傳入${}占位符讀取配置文件。
@Scheduled(fixedDelayString = "${task.two.fixedDelay}")
void taskTwo() {
System.out.println("現(xiàn)在時(shí)間:" + dateFormat.format(new Date()));
}
fixedRate
上一次開始執(zhí)行時(shí)間點(diǎn)之后多長(zhǎng)時(shí)間再執(zhí)行峻村。
fixedRate與fixedDelay的區(qū)別就是:fixedDelay是在上一個(gè)任務(wù)結(jié)束后才開始進(jìn)行間隔計(jì)時(shí)麸折,也就是說(shuō)兩次任務(wù)之間的時(shí)間差等于間隔+任務(wù)執(zhí)行耗時(shí),而fixedRate是在上一個(gè)任務(wù)一開始就已經(jīng)開始進(jìn)行間隔計(jì)時(shí)了粘昨,可以視為固定等于設(shè)置的間隔時(shí)間垢啼。
fixedRateString
與fixedRate一樣窜锯,傳入字符串,支持占位符讀取配置文件芭析。
initialDelay
第一次任務(wù)延遲時(shí)間锚扎。
initialDelayString
同initialDelay,支持占位符讀取配置信息馁启。