Spring定时任务注解@Scheduled详解
作者:至学者
一 概述
@Scheduled注解是包org.springframework.scheduling.annotation中的一个注解,主要是用来开启定时任务。
二 @Scheduled注解的源码
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Repeatable(Schedules.class) public @interface Scheduled { String CRON_DISABLED = "-"; String cron() default ""; String zone() default ""; long fixedDelay() default -1L; String fixedDelayString() default ""; long fixedRate() default -1L; String fixedRateString() default ""; long initialDelay() default -1L; String initialDelayString() default ""; }
根据注解源码可知,该注解是方法声明式注解和注解类型声明式注解。
三 @Scheduled注解中的主要参数
fixedDelay
@Scheduled(fixedDelay = 5000) //将一个方法以上一个调用任务的完成之间为基准,在上一个任务完成之后,5s后再执行该方法。 public void doSomething() { // something that should execute periodically }
fixedRate
@Scheduled(fixedRate = 5000) //将一个方法以固定速率5s调用一次执行,这个周期是一个任务开始时间为基准,从上一个任务开始执行后5秒后再调用一次。 public void doSomething() { // something that should execute periodically }
上述两个重要的参数只是提了简单的定时调用规则,当需要更为复杂的调用时我们可以通过参数cron进行设置。
四 复杂调度之参数cron
我们可以通过参数corn来编写表达式,然后通过表达式来配置任务的执行时间。其中每个corn表达式中至少会存在6个用空格分隔的时间元素,它们顺序依次为:
- 秒(0~59)
- 分钟(0~59)
- 小时(0~23)
- 天(0~31)
- 月(0~11)
- 星期(1~7或者SUN-SAT[SUN,MON,TUE,WED,THU,FRI,SAT])
- 年份(1970~2099)
Seconds Minutes Hours DayofMonth Month DayofWeek
Cron格式中每个时间元素的说明
时间元素 | 可出现的字符 | 有效数值范围 |
Seconds | ,- * / | 0~59 |
Minutes | ,- * / | 0~59 |
Hours | ,- * / | 0~23 |
DayofMonth | ,- * / ? L W | 0~31 |
Month | ,- * / | 1~12 |
DayofWeek | ,- * / ? L # | 1~7或者SUN~SAT |
Cron格式中特殊字符说明
字符 | 作用 | 举例 |
, | 列出枚举值 | 在Minutes域中使用6,8,则表示6分钟和8分钟各触发一次 |
- | 表示触发的范围值 | 在Minutes域中使用6-8,则表示从6分钟到8分钟之间每分钟触发一次 |
* | 匹配任意值 | 在Minutes域中使用*,则表示每分钟都会触发一次 |
/ | 起始时间开始触发,每隔固定时间触发一次 | 在Minutes域中使用6/8,表示5分钟触发一次,每10分钟再触发一次 |
? | 在DayofMonth和DayofWeek中,用于匹配任意值 | 在DayofMonth域使用?,表示每天都触发一次 |
# | 在DayofMonth中,确定第几个星期几 | 7#3表示第三个星期六 |
L | 表示最后 | 在DayofWeek中使用6L,表示在最后一个星期五触发 |
W | 表示有效工作日(周一到周五) | 在DayofMonth使用5W,如果5日是星期六,则将最近的工作日4日触发一次 |
注意:LW是可以连用,表示在某个月最后一个工作日,#是用来确定每个月第几个星期几的,只能出现在DayofMonth域中。
常用的Cron表达式
每隔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 * * ?"
每天上午10点,下午2点,4点:"0 0 10,14,16 * * ?"
朝九晚五工作时间内每半小时:"0 0/30 9-17 * * ?"
表示每个星期三中午12点:"0 0 12 ? * WED"
每天中午12点触发:"0 0 12 * * ?"
每天上午10:15触发:"0 15 10 ? * *"
每天上午10:15触发:"0 15 10 * * ?"
每天上午10:15触发:"0 15 10 * * ? *"
2005年的每天上午10:15触发: "0 15 10 * * ? 2005"
在每天下午2点到下午2:59期间的每1分钟触发: "0 * 14 * * ?"
在每天下午2点到下午2:55期间的每5分钟触发: "0 0/5 14 * * ?"
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发: "0 0/5 14,18 * * ?"
在每天下午2点到下午2:05期间的每1分钟触发: "0 0-5 14 * * ?"
每年三月的星期三的下午2:10和2:44触发: "0 10,44 14 ? 3 WED"
周一至周五的上午10:15触发: "0 15 10 ? * MON-FRI"
每月15日上午10:15触发: "0 15 10 15 * ?"
每月最后一日的上午10:15触发: "0 15 10 L * ?"
每月的最后一个星期五上午10:15触发: "0 15 10 ? * 6L"
2002年至2005年的每月的最后一个星期五上午10:15触发: "0 15 10 ? * 6L 2002-2005"
到此这篇关于Spring定时任务注解@Scheduled详解的文章就介绍到这了,更多相关Spring的@Scheduled内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!