乐趣区

关于程序员:Spring中定时任务Schedule注解的使用

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#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 卡死以及源码解析

退出移动版