为什么我们只要添加注解就可以使用spring调度相关的组件呢?
先来看看这个注解的内部
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {
}
其实归根到底起作用的还是SchedulingConfiguration这个类,看到里面,其实最主要的功能就是注入了一个内部的后置处理器ScheduledAnnotationBeanPostProcessor。用于处理@Scheduled注解。原理暂时不知道,后面再看看。
@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class SchedulingConfiguration {
@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
return new ScheduledAnnotationBeanPostProcessor();
}
}
那么生产环境下,定时器必然需要开启,测试环境下呢?不一定
于是乎,怎么控制?
代码如下
@Configuration
@ConditionalOnExpression(value = "${enable.scheduling}")
@Import(SchedulingConfiguration.class)
public class ControlSchedulingConfiguration {
}
我们只需要在配置文件中,通过配置自定义的环境变量来控制SchedulingConfiguration类的导入,就可以完成对定时任务的控制了。
若value不存在,默认是为true的,所以我们只需要在测试环境中配enable.scheduling=false即可将定时任务关闭。
网友评论