1. 概述
@Scheduled 注解是 spring boot 提供的用于定时工作管制的注解, 次要用于管制工作在某个指定工夫执行, 或者每隔一段时间执行. 留神须要配合 @EnableScheduling 应用, 配置 @Scheduled 次要有三种配置执行工夫的形式,cron,fixedRate,fixedDelay。它的配置一共有 8 个参数。
(在被 spring 初始化之后,这个定时工作就开始执行了,上面几种 cron、fixedDelay、fixedRate 等注解都是这样。)
2. 参数解说
2.1 cron 表达式
该参数接管一个 cron 表达式
,cron 表达式
是一个字符串,字符串以 5 或 6 个空格隔开,离开共 6 或 7 个域,每一个域代表一个含意。
cron 表达式语法
[秒] [分] [小时] [日] [月] [周] [年]
注:[年]不是必须的域,能够省略[年],则一共 6 个域
序号 | 阐明 | 必填 | 容许填写的值 | 容许的通配符 |
---|---|---|---|---|
1 | 秒 | 是 | 0-59 | , – * / |
2 | 分 | 是 | 0-59 | , – * / |
3 | 时 | 是 | 0-23 | , – * / |
4 | 日 | 是 | 1-31 | , – * ? / L W |
5 | 月 | 是 | 1-12 / JAN-DEC | , – * / |
6 | 周 | 是 | 1-7 or SUN-SAT | , – * ? / L # |
7 | 年 | 否 | 1970-2099 | , – * / |
通配符阐明:
*
示意所有值。例如: 在分的字段上设置 *, 示意每一分钟都会触发。?
示意不指定值。应用的场景为不须要关怀以后设置这个字段的值。例如: 要在每月的 10 号触发一个操作,但不关怀是周几,所以须要周地位的那个字段设置为”?”具体设置为 0 0 0 10 * ?-
示意区间。例如 在小时上设置“10-12”, 示意 10,11,12 点都会触发。,
示意指定多个值,例如在周字段上设置“MON,WED,FRI”示意周一,周三和周五触发/
用于递增触发。如在秒下面设置”5/15”示意从 5 秒开始,每增 15 秒触发(5,20,35,50)。在日字段上设置’1/3’所示每月 1 号开始,每隔三天触发一次。L
示意最初的意思。在日字段设置上,示意当月的最初一天(根据以后月份,如果是二月还会根据是否是润年[leap]), 在周字段上示意星期六,相当于”7”或”SAT”。如果在”L”前加上数字,则示意该数据的最初一个。例如在周字段上设置”6L”这样的格局, 则示意“本月最初一个星期五”W
示意离指定日期的最近那个工作日 (周一至周五). 例如在日字段上置”15W”,示意离每月 15 号最近的那个工作日触发。如果 15 号正好是周六,则找最近的周五(14 号) 触发, 如果 15 号是周未,则找最近的下周一 (16 号) 触发. 如果 15 号正好在工作日(周一至周五),则就在该天触发。如果指定格局为“1W”, 它则示意每月 1 号往后最近的工作日触发。如果 1 号正是周六,则将在 3 号下周一触发。(注,”W”前只能设置具体的数字, 不容许区间”-“)。#
序号(示意每月的第几个周几),例如在周字段上设置”6#3”示意在每月的第三个周六. 留神如果指定”#5”, 正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再适合不过了);小提示:’L’和‘W’能够一组合应用。如果在日字段上设置”LW”, 则示意在本月的最初一个工作日触发;周字段的设置,若应用英文字母是不辨别大小写的,即 MON 与 mon 雷同。
示例
- 每隔 5 秒执行一次:/5 * ?
- 每隔 1 分钟执行一次:0 /1 ?
- 每天 23 点执行一次:0 0 23 ?
- 每天凌晨 1 点执行一次:0 0 1 ?
- 每月 1 号凌晨 1 点执行一次:0 0 1 1 * ?
- 每月最初一天 23 点执行一次:0 0 23 L * ?
- 每周星期六凌晨 1 点履行一次:0 0 1 ? * L
- 在 26 分、29 分、33 分执行一次:0 26,29,33 * ?
- 每天的 0 点、13 点、18 点、21 点都执行一次:0 0 0,13,18,21 ?
cron 表达式应用占位符
另外,cron
属性接管的 cron 表达式
反对占位符。eg:
配置文件:
time:
cron: */5 * * * * *
interval: 5
每 5 秒执行一次:
@Scheduled(cron="${time.cron}")
void testPlaceholder1() {System.out.println("Execute at" + System.currentTimeMillis());
}
@Scheduled(cron="*/${time.interval} * * * * *")
void testPlaceholder2() {System.out.println("Execute at" + System.currentTimeMillis());
}
2.2. zone
时区,接管一个 java.util.TimeZone#ID
。cron 表达式
会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比方咱们个别应用的时区Asia/Shanghai
。该字段咱们个别留空。
2.3. fixedDelay
上一次执行结束工夫点之后多长时间再执行。如:
@Scheduled(fixedDelay = 5000) // 上一次执行结束工夫点之后 5 秒再执行
2.4. fixedDelayString
与 3. fixedDelay
意思雷同,只是应用字符串的模式。惟一不同的是反对占位符。如:
@Scheduled(fixedDelayString = "5000") // 上一次执行结束工夫点之后 5 秒再执行
占位符的应用(配置文件中有配置:time.fixedDelay=5000):
@Scheduled(fixedDelayString = "${time.fixedDelay}")
void testFixedDelayString() {System.out.println("Execute at" + System.currentTimeMillis());
}
运行后果
2.5. fixedRate
上一次开始执行工夫点之后多长时间再执行。如:
@Scheduled(fixedRate = 5000) // 上一次开始执行工夫点之后 5 秒再执行
2.6. fixedRateString
与 5. fixedRate
意思雷同,只是应用字符串的模式。惟一不同的是反对占位符。
2.7. initialDelay
第一次提早多长时间后再执行。如:
@Scheduled(initialDelay=1000, fixedRate=5000) // 第一次提早 1 秒后执行,之后按 fixedRate 的规定每 5 秒执行一次
2.8. initialDelayString
与 7. initialDelay
意思雷同,只是应用字符串的模式。惟一不同的是反对占位符。
2.9 三种执行机制小测试后果(参考文章)
1、fixedRate 配置了 上一次工作的开始工夫 到下一次工作的开始工夫 的距离,每次工作都会执行;
2、fixedDelay 配置了 上一次工作的完结工夫 到下一次工作的开始工夫 的距离,每次工作都会执行;
3、cron 表达式配置了在哪一刻执行工作,会在配置的工作开始工夫判断工作是否能够执行,如果能则执行,不能则会跳过本次执行;
4、如果是强调 工作距离 的定时工作,倡议应用 fixedRate 和 fixedDelay,如果是强调工作在某时某分某刻执行的定时工作,倡议应用 cron 表达式。
3. 源码剖析
源码剖析能够参考:源码解析
当前学会后再做补充
参考
@schedule 的执行机制测试
@schedule 卡死以及源码解析