java - Spring Boot @EnableScheduling 有条件地

标签 java spring-boot

有没有办法根据应用程序属性使@EnableScheduling 成为条件?也可以根据属性禁用 Controller 吗?

我想要实现的是让相同的 spring boot 应用程序用于处理 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 */
   }
}

最佳答案

我解决了这个问题,以下是我所做的以供将来引用:

  • 从我的应用程序中删除了@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

关于java - Spring Boot @EnableScheduling 有条件地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39182633/

相关文章:

java - 如何避免 'javassist.CannotCompileException: no method body'

JavaFX-如何避免将空值从任何内容加载到 TextField?

java - Android - HTTPURLConnection 在发布多个输入时失败

java - 关闭 Spring Boot AWS 自动配置

spring-boot - Gradle 5 JUnit BOM 和 Spring Boot 版本不正确

java - 标识符 userName 未解析(不是静态字段)<有时>

java - 如何处理JPA命名查询中数字类型的空值

spring-boot - 我可以在运行时向我的@kafkalistener 添加主题吗

java - 在 application.properties 中使用 spring.profile.default 时,Spring Boot 不加载默认配置文件

java - TypeScript 映射到 Java 映射