# 前言

由于项目中有必要实现定时任务的动态管理, 所以需要重新实现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的参数

  1. cron()

定时任务的cron表达式, 这里关于表达式的具体写法就不做赘述了.

  1. fixedDelay()

上次调用结束和下次调用开始中间的间隔时间, 单位ms

  1. fixedDelayString()

与fixedDelay()相同, 并且解析方法不一样

  1. fixedRate()

两次开始调用的间隔时间, 与fixedDelay不同.

  1. fixedRateString()

同上

  1. initialDelay()

在第一次执行fixedRate任务之前, 延迟多少ms

  1. initialDelayString()

同上

# ScheduledAnnotationBeanPostProcessor 如何实现定时任务

spring的定时任务是由此类实现

# 继承类的探秘

  1. ScheduledTaskHolder

  2. MergedBeanDefinitionPostProcessor

  3. DestructionAwareBeanPostProcessor

# 类中方法的探秘

  1. ScheduledAnnotationBeanPostProcessor的构造方法

本类的构造方法有两个, 都是为了创建一个ScheduledTaskRegistrar类, 无参构造是直接new, 有参构造是由外部传入.

  1. getOrder()

此方法实现org.springframework.core的Ordered接口方法
设置低优先级

  1. setScheduler(Object scheduler)

设置要执行的任务对象, 可以是TaskScheduler, 或者用ScheduledExecutorService

  1. setEmbeddedValueResolver(StringValueResolver resolver)

实现自org.springframework.context.EmbeddedValueResolverAware接口的方法
用于注入StringValueResolver来解析字符串

  1. setBeanName(String beanName)

实现自org.springframework.beans.factory.BeanNameAware接口的方法
在创建bean的容器中设置bean的名称

  1. setBeanFactory(BeanFactory beanFactory)

实现自org.springframework.beans.factory.BeanFactoryAware接口的方法
设置是可选的, 如果不设置则不会自动检测SchedulingConfigurer

  1. setApplicationContext(ApplicationContext applicationContext)

可选设置, 如果设置, 任务将在ContextRefreshedEvent阶段被激活; 如果未设置, 则任务激活将在afterSingletonsInstantiated时.

  1. afterSingletonsInstantiated()

移除缓存中被解决的单例classes,

  1. onApplicationEvent(ContextRefreshedEvent event)

  2. finishRegistration()

  3. resolveSchedulerBean(BeanFactory beanFactory, Class schedulerType, boolean byName)

# 解读相关类

  1. TaskScheduler

  2. ScheduledExecutorService

  3. SchedulingConfigurer

  4. ContextRefreshedEvent

官方注释
Event raised when an {@code ApplicationContext} gets initialized or refreshed.

ApplicationContext被初始化或刷新时, 引发此事件

  1. SmartInitializingSingleton

# 如何启动的

# 如何扫描

修改于: 8/11/2022, 3:17:56 PM