学科分类
目录
Spring Boot开发

定时任务介绍

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毫秒)重复执行定时任务。

点击此处
隐藏目录