1 缘起
最近看到有些定时任务的项目,
使用了Spring自带的定时任务系统,通过添加@Scheduled注解的方式实现,
并且,使用了不只cron表达式的方式实现定时执行,
恍然大悟,原来@Scheduled还有其他的方式实现定时任务,
于是,看了下@Scheduled的源码,发现有三类参数供开发者使用,cron、fixedDelay和fixedRate,同时,复习了一下cron表达式,
分享如下,帮助读者进一步了解@Scheduled的使用,轻松应对知识交流与知识考核。
版本:Spring-Context:5.2.7.RELEASE
2 注解:@Scheduled
2.1 是什么
先看下注解的注释,如下图所示。
位置:org.springframework.scheduling.annotation.Scheduled
由注释可知,
(1)注解@Scheduled标注在方法上实现定时功能;
(2)使用注解时必须指定任意一个参数(属性):cron、fixedDelay或fixedRate;
(3)注解标识的方法必须时无参方法且无返回值。如果有返回值,返回值会被忽略;
(4)有两种方式生效该注解:XML中配置:task:annotaion–driven,或者使用注解:@EnableScheduling;
(5)定时任务的相关逻辑在:ScheduledAnnotationBeanPostProcessor(org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor)。
2.2 功能
(1)定时执行任务:指定执行的星期、月、天、时、分、秒,定时执行任务,cron参数;
(2)固定周期执行任务:间隔x毫秒周期性指定任务,fixRate参数;
(3)固定间隔延迟执行任务:延迟x毫秒执行指定任务,fixDelay参数。
2.3 参数分析
2.3.1 CRON_DISABLED
常量参数CRON_DISABLED,用于配置未生效定时任务,
值为:-
,如果已经配置了定时任务,但是,不想启用定时任务,则配置cron为-
。
在ScheduledAnnotationBeanPostProcessor中使用该参数,用于判断cron表达式是否生效。
具体的方法为processScheduled,处理逻辑如下图所示,
由图可知,检查cron表达式,如果cron表达式为-
,则该定时任务,不会被添加到任务池。
位置:org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor#processScheduled
2.3.2 cron
CRON类型的表达式,配置定时任务,共有6个时间粒度,
参数样式:a b c d e f
从左到右分别表示:
秒、分、小时、天、月、星期。