2016-08-27 2 views
6

Есть ли способ сделать @EnableScheduling условным на основе свойства приложения? также можно также отключить контроллеры на основе свойств?Spring Boot @EnableScheduling условно

То, что я пытаюсь достичь, - иметь такое же приложение загрузки весны, которое используется для обслуживания веб-запросов (но не запускать запланированные задачи на одном компьютере), а также установить такое же приложение на серверных серверах для запуска только запланированных задач ,

Мое приложение выглядит следующим образом

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

ответ

7

Я решил эту проблему, вот что я сделал для будущей ссылки:

  • Удалены @ 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")); 
    } 

} 

Кроме того, чтобы отключить веб-сервер на внутренний сервер, добавьте следующую строку в файл application.properties:

spring.main.web_environment=false 
3

Вы можете аннотировать инъекции фасоли, как это:

@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{...} 
+0

Найдено, что это много лишней работы, так как мне нужно отключить/включить все задания сразу, проверить мой ответ –

+3

'@ ConditionalOnProperty' не будет влиять на метод' @ Scheduled', так как, как и все условия, это влияет только на регистрацию bean-компонентов. См. Javadoc для получения дополнительной информации: http://docs.spring.io/spring-framework/docs/4.3.2.RELEASE/javadoc-api/org/springframework/context/annotation/Conditional.html?is-external=true –

+0

Неплохо и спасибо за исправление, я только что отредактировал ответ :) – imTachu

Смежные вопросы