有条件地弹簧启动@EnableScheduling

时间:2016-08-27 15:13:22

标签: java spring-boot

有没有办法根据应用程序属性使@EnableScheduling有条件?也可以根据属性禁用控制器吗?

我想要实现的是使用相同的Spring启动应用程序来处理Web请求(但不能在同一台计算机上运行计划任务),并在后端服务器上安装相同的应用程序以仅运行计划任务。

我的应用程序看起来像这样

@SpringBootApplication
@EnableScheduling
@EnableTransactionManagement
public class MyApp {

   public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
   }

}

示例预定作业看起来像这样

@Component
public class MyTask {

   @Scheduled(fixedRate = 60000)
   public void doSomeBackendJob() {
       /* job implementation here */
   }
}

4 个答案:

答案 0 :(得分:8)

我解决了这个问题,这是我今后所做的工作:

  • 从我的应用中删除了@EnableScheduling注释
  • 添加了一个新配置类,并根据应用程序属性启用/禁用调度

-

 @Configuration
 public class Scheduler {

    @Conditional(SchedulerCondition.class)
    @Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
        return new ScheduledAnnotationBeanPostProcessor();
    }
}

条件类

public class SchedulerCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return Boolean.valueOf(context.getEnvironment().getProperty("com.myapp.config.scheduler.enabled"));
    }

}

此外,要在后端服务器上禁用Web服务器,只需将以下内容添加到application.properties文件中:

spring.main.web_environment=false

答案 1 :(得分:3)

您可以像这样注释bean注入:

SendMessage();

奖励:由于您希望在不同的计算机上运行不同的东西,即您将使用不同的配置部署相同的应用程序,您可以使用弹簧配置文件,如果是这样的话,您可以注释类或方法,如这样:

@Bean
@ConditionalOnProperty(prefix = "your.property", name = "yes", matchIfMissing = true)
public void doSomeBackendJob() {
       /* job implementation here */
}

答案 2 :(得分:0)

我最终为调度创建了一个单独的@Configuration类,并使用@ConditionalOnProperty批注来切换调度

@Configuration
@EnableScheduling
@ConditionalOnProperty(prefix = "scheduling", name="enabled", havingValue="true", matchIfMissing = true)
public class SchedulerConfig {

}

在我的application.yml文件中,然后我添加了

scheduling:
  enabled: true

答案 3 :(得分:0)

  1. 我认为调度程序不是配置。
  2. 无需在prefix中设置@ConditionalOnProperty
  3. 无需在配置类的@Bean上创建调度程序。

我的变体:

@Component
@EnableScheduling
@ConditionalOnProperty(value = "scheduler.enabled", havingValue = "true")
public class MyScheduler {

    @Scheduled(...)
    public void doWork() {
        ...
    }
}