如何通过配置控制@EnableScheduling呢?

2020-11-09  本文已影响0人  guessguess

为什么我们只要添加注解就可以使用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即可将定时任务关闭。

上一篇 下一篇

猜你喜欢

热点阅读