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个域

序号阐明必填容许填写的值容许的通配符
10-59, - * /
20-59, - * /
30-23, - * /
41-31, - * ? / L W
51-12 / JAN-DEC, - * /
61-7 or SUN-SAT, - * ? / L #
71970-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#IDcron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比方咱们个别应用的时区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卡死以及源码解析