Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot@EnableScheduling有条件地_Java_Spring Boot - Fatal编程技术网

Java Spring Boot@EnableScheduling有条件地

Java Spring Boot@EnableScheduling有条件地,java,spring-boot,Java,Spring Boot,有没有办法根据应用程序属性使@EnableScheduling成为有条件的?也可以基于属性禁用控制器吗 我试图实现的是使用相同的spring boot应用程序来服务web请求(但不在同一台机器上运行计划任务),并在后端服务器上安装相同的应用程序以仅运行计划任务 我的应用程序看起来像这样 @SpringBootApplication @EnableScheduling @EnableTransactionManagement public class MyApp { public stat

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

我试图实现的是使用相同的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 */
   }
}
示例计划作业如下所示

@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 */
   }
}

您可以这样注释bean注入:

@Bean
@ConditionalOnProperty(prefix = "your.property", name = "yes", matchIfMissing = true)
public void doSomeBackendJob() {
       /* job implementation here */
}
@Component
@Profile({ Constants.SPRING_PROFILE_PRODUCTION, Constants.SPRING_PROFILE_TEST })
public class TheClass{...}
额外好处:由于您希望在不同的机器上运行不同的东西,即您将使用不同的配置部署同一个应用程序,因此您可以使用spring概要文件,如果是这种情况,您可以这样注释一个类或方法:

@Bean
@ConditionalOnProperty(prefix = "your.property", name = "yes", matchIfMissing = true)
public void doSomeBackendJob() {
       /* job implementation here */
}
@Component
@Profile({ Constants.SPRING_PROFILE_PRODUCTION, Constants.SPRING_PROFILE_TEST })
public class TheClass{...}

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

  • 已从我的应用程序中删除@EnableScheduling批注
  • 添加了新的配置类和条件以基于应用程序属性启用/禁用调度
-

还有条件类

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

最后,我创建了一个单独的@Configuration类用于调度,并使用@ConditionalOnProperty注释切换调度

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

}
在application.yml文件中,我添加了

scheduling:
  enabled: true
  • 我认为调度程序不是配置
  • 无需在
    @ConditionalOnProperty
  • 无需在配置类中的
    @Bean
    上创建调度器
  • 我的变体:

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

    发现这是一个很大的额外工作,因为我需要一次禁用/启用所有作业,请检查我的答案
    @ConditionalOnProperty
    @Scheduled
    方法没有影响,因为与所有条件一样,它只影响bean注册。请参阅javadoc以了解更多详细信息:我的错误,谢谢您的更正,我刚刚编辑了答案:)这仍然不起作用。这项工作永远不会像它永远不会那样运行scheduled@TimStack不要抱怨这篇文章,然后在评论中确认它。你没有达到你抱怨的目的。@Rob我没有抱怨。如果我认为某个答案确实是有用的,我宁愿看到它被编辑和教授,也不愿看到文章被删除。@TimStack extended.)这是可行的,但如何在方法层面上实现它…这是可行的,但如何在方法层面上实现它。。。