# 前言
由于项目中有必要实现定时任务的动态管理, 所以需要重新实现spring的@Scheduled
本文的spring版本是5.1.9.RELEASE
# @Schedules
源码上的注释如下, 指明了Schedules相当于Scheduled的容器注解
Container annotation that aggregates several {@link Scheduled} annotations.
<p>Can be used natively, declaring several nested {@link Scheduled} annotations.
Can also be used in conjunction with Java 8's support for repeatable annotations,
where {@link Scheduled} can simply be declared several times on the same method,
implicitly generating this container annotation.
# @Scheduled的参数
- cron()
定时任务的cron表达式, 这里关于表达式的具体写法就不做赘述了.
- fixedDelay()
上次调用结束和下次调用开始中间的间隔时间, 单位ms
- fixedDelayString()
与fixedDelay()相同, 并且解析方法不一样
- fixedRate()
两次
开始调用的间隔时间, 与fixedDelay不同.
- fixedRateString()
同上
- initialDelay()
在第一次执行fixedRate任务之前, 延迟多少ms
- initialDelayString()
同上
# ScheduledAnnotationBeanPostProcessor 如何实现定时任务
spring的定时任务是由此类实现
# 继承类的探秘
ScheduledTaskHolder
MergedBeanDefinitionPostProcessor
DestructionAwareBeanPostProcessor
# 类中方法的探秘
- ScheduledAnnotationBeanPostProcessor的构造方法
本类的构造方法有两个, 都是为了创建一个ScheduledTaskRegistrar类, 无参构造是直接new, 有参构造是由外部传入.
- getOrder()
此方法实现org.springframework.core的Ordered接口方法
设置低优先级
- setScheduler(Object scheduler)
设置要执行的任务对象, 可以是
TaskScheduler, 或者用ScheduledExecutorService
- setEmbeddedValueResolver(StringValueResolver resolver)
实现自org.springframework.context.EmbeddedValueResolverAware接口的方法
用于注入StringValueResolver来解析字符串
- setBeanName(String beanName)
实现自org.springframework.beans.factory.BeanNameAware接口的方法
在创建bean的容器中设置bean的名称
- setBeanFactory(BeanFactory beanFactory)
实现自org.springframework.beans.factory.BeanFactoryAware接口的方法
设置是可选的, 如果不设置则不会自动检测SchedulingConfigurer
- setApplicationContext(ApplicationContext applicationContext)
可选设置, 如果设置, 任务将在ContextRefreshedEvent阶段被激活; 如果未设置, 则任务激活将在afterSingletonsInstantiated时.
- afterSingletonsInstantiated()
移除缓存中被解决的单例classes,
onApplicationEvent(ContextRefreshedEvent event)
finishRegistration()
resolveSchedulerBean(BeanFactory beanFactory, Class
schedulerType, boolean byName)
# 解读相关类
TaskScheduler
ScheduledExecutorService
SchedulingConfigurer
ContextRefreshedEvent
官方注释
Event raised when an {@code ApplicationContext} gets initialized or refreshed.
ApplicationContext被初始化或刷新时, 引发此事件
- SmartInitializingSingleton