定时任务介绍
Spring框架的定时任务调度功能支持配置和注解两种方式,Spring Boot在Spring框架的基础上实现了继承,并对其中基于注解方式的定时任务实现了非常好的支持。下面,针对Spring Boot项目中基于注解方式的定时任务调度的相关注解和使用进行介绍。
1.@EnableScheduling
@EnableScheduling注解是Spring框架提供的,用于开启基于注解方式的定时任务支持,该注解主要用在项目启动类上。
2.@Scheduled
@Scheduled注解同样是Spring框架提供的,配置定时任务的执行规则,该注解主要用在定时业务方法上。@Scheduled注解提供有多个属性,精细化配置定时任务执行规则,这些属性及说明如表1所示。
表1 @Scheduled注解属性及说明
属性 | 说明 |
---|---|
cron | 类似于cron的表达式,可以定制定时任务触发的秒、分钟、小时、月中的日、月、周中的日 |
zone | 指定cron表达式将被解析的时区。默认情况下,该属性是空字符串(即使用服务器的本地时区) |
fixedDelay | 表示在上一次任务执行结束后在指定时间后继续执行下一次任务(属性值为long类型) |
fixedDelayString | 表示在上一次任务执行结束后在指定时间后继续执行下一次任务(属性值为long类型的字符串形式) |
fixedRate | 表示每隔指定时间执行一次任务(属性值为long类型) |
fixedRateString | 表示每隔指定时间执行一次任务(属性值为long类型的字符串形式) |
initialDelay | 表示在fixedRate或fixedDelay任务第一次执行之前要延迟的毫秒数(属性值为long类型) |
initialDelayString | 表示在fixedRate或fixedDelay任务第一次执行之前要延迟的毫秒数(属性值为long类型的字符串形式) |
下面,分别针对上述表1所述的@Scheduled注解属性进行讲解并举例说明。
(1)cron属性
cron属性是@Scheduled定时任务注解中最常用也是最复杂的一个属性,其属性值由类似于cron表达式的6位数组成,可以详细地指定定时任务执行的秒、分、小时、日、月、星期。下面,通过一个具体的示例说明,示例代码如下。
@Scheduled(cron = "0 * * * * MON-FRI")
上述代码中,cron = "0 * * * * MON-FRI"表示周一到周五每一分钟执行一次定时任务。其中,第一位属于秒位,0表示整数时间段,按照每一分钟计算;中间的三位分别属于分、时、日、月位,*表示任意时刻;最后一位属于星期位,MON-FRI表示周一到周五时间区间。需要说明的是,如果使用cron属性配置的是每隔一段时间执行一次任务,那么定时任务的首次执行时间通常是整数时间点,例如定时任务每隔7分钟执行一次,那么首次执行的时间必须是7的倍数分钟。
除此之外,cron属性值的每一位还支持非常丰富的字段值,具体说明如表2所示。
表2 cron属性字段值介绍
字段 | 可取值 | 允许的特殊字符 |
---|---|---|
秒 | 0~59 | , - * / |
分 | 0~59 | , - * / |
小时 | 0~23 | , - * / |
日 | 1~31 | , - * / ? L |
月 | 1~12、月份对应英文前三个字母(大小写均可) | , - * / |
星期 | 0~7(0和7表示SUN)、星期对应英文前三个字母(大小写均可) | , - * / ? L |
上表2中列举了@Schedule注解中cron属性6位字段的可取值,这些字段值除了基本的数字之外还有一些特殊字符。其中,上述特殊字符的具体说明及示例如表3所示。
表3 cron属性字段值特殊字符介绍
特殊字符 | 说明 | 示例 |
---|---|---|
, | 表示枚举 | @Scheduled(cron = "1,3,5 * * * * *")表示任意时间的1、3、5秒钟都会执行 |
- | 表示区间 | 参考前面已列举示例 |
* | 表示任意可取值 | 参考前面已列举示例 |
/ | 表示步长 | @Scheduled(cron = "0/5 * * * * *")表示从任意时间的整秒开始,每隔5秒都会执行 |
? | 日/星期冲突匹配符 | @Scheduled(cron = "0 * * 26 * ?")表示每月的26日每一分钟都执行 |
L | 最后 | @Scheduled(cron = "0 0 * L * ?")表示每月最后一日每一小时都执行 |
需要说明的是,注解@Scheduled的cron属性是类似于cron的表达式,而不是完全一致的,所以只提供6位字段赋值,同时对一些cron表达式支持的特殊字符(例如C、W、#)是不支持的。
(2)zone属性
zone属性主要与cron属性配合使用,指定解析cron属性值的时区。通常情况下,不需要指定zone属性,cron属性值会自动以服务器所在区域作为本地时区进行表达式解析。例如,中国地区服务器的时区通常默认为Asia/Shanghai。
(3)fixedDelay和fixedDelayString属性
fixedDelay和fixedDelayString属性的作用类似,指定在上一次任务执行结束后在指定时间后继续执行下一次任务,它们的主要区别是属性值的类型不同,其中fixedDelay属性值为long类型,而fixedDelayString属性值为long类型的字符串。下面,通过一个具体的示例说明,示例代码如下。
@Scheduled(fixedDelay = 5000)
@Scheduled(fixedDelayString = "5000")
上述代码中,fixedDelay = 5000和fixedDelayString = "5000"都表示在程序启动后,会立即执行一次定时任务,然后在任务执行结束后,相隔5秒钟(5000毫秒)重复执行定时任务。
(4)fixedRate和fixedRateString属性
fixedRate和fixedRateString属性的作用类似,指定每相隔一段时间重复执行一次定时任务,它们的主要区别是属性值的类型不同,其中fixedRate属性值为long类型,fixedRateString属性值为long类型的字符串。下面,通过一个具体的示例说明,示例代码如下。
@Scheduled(fixedRate = 5000)
@Scheduled(fixedRateString = "5000")
上述代码中,fixedRate = 5000和fixedRateString = "5000"都表示在程序启动后,会立即执行一次定时任务,然后相隔5秒钟(5000毫秒)重复执行定时任务。
需要说明的是,fixedRate/fixedRateString属性与fixedDelay/fixedDelayString属性的作用有些类似,都是相隔一段时间再重复执行定时任务,它们主要区别是:fixedDelay/fixedDelayString属性的下一次执行时间必须是在上一次任务执行完成后开始计时;fixedRate/fixedRateString属性的下一次执行时间是在上一次任务执行开始计时,如果遇到配置相隔时间小于定时任务执行时间,那么下一次任务会在上一次任务执行完成后立即重复执行。
(5)initialDelay和initialDelayString属性
initialDelay和initialDelayString属性的作用类似,主要是与fixedRate/fixedRateString或者fixedDelay/fixedDelayString属性配合使用,指定定时任务第一次执行的延迟时间,然后再按照各自相隔时间重复执行任务。下面,通过一个具体的示例说明,示例代码如下。
@Scheduled(initialDelay=1000, fixedDelay=5000)
@Scheduled(initialDelay=1000, fixedRate=5000)
上述代码中,都表示在程序启动后,会延迟1秒(1000毫秒)后再执行第一次定时任务,然后相隔5秒钟(5000毫秒)重复执行定时任务。