2016-08-27 22 views
6

Czy istnieje sposób na warunkowanie @EnableScheduling na podstawie właściwości aplikacji? czy możliwe jest również wyłączenie kontrolerów na podstawie właściwości?Spring Boot @EnableScheduling warunkowo

Co staram się osiągnąć, to mieć tę samą aplikację rozruchową, która służy do obsługi żądań internetowych (ale nie uruchamiać zaplanowanych zadań na tym samym komputerze), a także instalować tę samą aplikację na serwerach zaplecza, aby uruchamiać tylko zaplanowane zadania .

Moja aplikacja wygląda tak

@SpringBootApplication 
@EnableScheduling 
@EnableTransactionManagement 
public class MyApp { 

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

} 

i próbki zaplanowane zadanie wygląda to

@Component 
public class MyTask { 

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

Odpowiedz

7

Rozwiązałem to, tutaj jest to, co zrobiłem dla przyszłości:

  • Usunięto @ EnableScheduling adnotacji z mojej aplikacji
  • Dodano nową klasę konfiguracji i warunkowego, aby włączyć/wyłączyć harmonogram oparty na własności aplikacji

-

@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(); 
    } 
} 

I klasa warunkowy

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

} 

Ponadto, aby wyłączyć serwer WWW na serwerze backend, wystarczy dodać następujące do pliku application.properties:

spring.main.web_environment=false 
3

Można opisywanie zastrzyk fasoli takiego:

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

Bonus: Rejestracja chcesz uruchamiać różne rzeczy na różnych komputerach, tzn. wdrożysz tę samą aplikację z inną konfiguracją ia, można użyć profili wiosnę, jeśli to przypadek można opisywanie klasy lub metody takie jak to:

@Component 
@Profile({ Constants.SPRING_PROFILE_PRODUCTION, Constants.SPRING_PROFILE_TEST }) 
public class TheClass{...} 
+0

Okazało się, że dużo dodatkowej pracy, ponieważ muszę wyłączyć/uaktywnić wszystkie zadania naraz, sprawdź moją odpowiedź –

+3

'@ ConditionalOnProperty' nie będzie miało wpływu na metodę' @ Scheduled', ponieważ, jak wszystkie warunki, wpływa tylko na rejestrację fasoli. Więcej informacji znajduje się w javadoc: http://docs.spring.io/spring-framework/docs/4.3.2.RELEASE/javadoc-api/org/springframework/context/annotation/Conditional.html?is-external=true –

+0

Moje złe i dzięki za poprawkę, właśnie zredagowałem odpowiedź :) – imTachu