2016-08-27 6 views
6

Gibt es eine Möglichkeit, @EnableScheduling basierend auf einer Anwendungseigenschaft bedingt zu machen? Ist es auch möglich, Controller basierend auf Eigenschaften zu deaktivieren?Spring Boot @EnableScheduling bedingt

Was ich versuche zu erreichen, ist die gleiche Spring-Boot-Anwendung verwendet Web-Anfragen zu bedienen (aber nicht geplante Aufgaben auf dem gleichen Rechner ausführen), und installieren Sie die gleiche Anwendung auf Backend-Servern nur geplante Aufgaben ausführen .

Meine app sieht aus wie dieser

@SpringBootApplication 
@EnableScheduling 
@EnableTransactionManagement 
public class MyApp { 

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

} 

und eine Probe geplanten Auftrag sieht wie folgt aus

@Component 
public class MyTask { 

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

Antwort

7

ich das hier gelöst, ist das, was ich für die Zukunft hat:

  • entfernt @ EnableScheduling Anmerkung aus meinem app
  • Es wurde eine neue Konfigurationsklasse und bedingte/deaktivieren Planung zu ermöglichen, auf der Grundlage einer Auftragungseigenschaft

-

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

Und die bedingte Klasse

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

} 

Auch Web-Server auf dem Back-End-Server zu deaktivieren, fügen Sie einfach die folgende auf die Datei application.properties:

spring.main.web_environment=false 
3

Sie eine Bohne Injektion wie diese mit Anmerkungen versehen kann:

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

Bonus: Seit Sie möchten verschiedene Dinge auf verschiedenen Rechnern ausführen, dh Sie werden dieselbe App mit unterschiedlichen Konfigurationen installieren gen, könnten Sie Federprofile verwenden, wenn das der Fall ist können Sie eine Klasse oder Methode wie folgt beschriften:

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

diese gefunden werden eine Menge zusätzlicher Arbeit, da ich alle Jobs auf einmal deaktivieren/aktivieren muss, überprüfe meine Antwort –

+3

'@ ConditionalOnProperty' hat keinen Effekt auf eine '@ Scheduled'-Methode, da sie, wie alle Bedingungen, nur die Bean-Registrierung betrifft. Weitere Informationen finden Sie im javadoc: http://docs.spring.io/spring-framework/docs/4.3.2.RELEASE/javadoc-api/org/springframework/context/annotation/Conditional.html?-external=true –

+0

Mein schlechtes und danke für die Korrektur, ich habe nur die Antwort bearbeitet :) – imTachu