2016-08-27 23 views
6

Có cách nào để thực hiện @EnableScheduling có điều kiện dựa trên thuộc tính ứng dụng không? cũng có thể vô hiệu hóa bộ điều khiển dựa trên các thuộc tính không?Khởi động mùa xuân @EnableScheduling có điều kiện

Những gì tôi đang cố gắng đạt được là có cùng ứng dụng khởi động mùa xuân được sử dụng để phục vụ yêu cầu web (nhưng không chạy tác vụ theo lịch trên cùng một máy) và cài đặt cùng một ứng dụng trên máy chủ phụ trợ. .

Ứng dụng của tôi trông như thế này

@SpringBootApplication 
@EnableScheduling 
@EnableTransactionManagement 
public class MyApp { 

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

} 

Và một công việc mẫu dự kiến ​​sẽ như thế này

@Component 
public class MyTask { 

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

Trả lời

7

tôi Giải Quyết này, đây là những gì tôi đã làm để tham khảo trong tương lai:

  • Removed @ EnableScheduling chú thích từ ứng dụng của tôi
  • thêm một lớp cấu hình mới và có điều kiện để bật/tắt lịch dựa trên một tài sản ứng dụng

-

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

Và các lớp có điều kiện

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

} 

Ngoài ra, để vô hiệu hóa máy chủ web trên máy chủ backend, chỉ cần thêm dòng sau vào các application.properties file:

spring.main.web_environment=false 
3

Bạn có thể chú thích một tiêm đậu như thế này:

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

Bonus: Kể từ bạn muốn chạy những thứ khác nhau trong các máy khác nhau, nghĩa là bạn sẽ triển khai cùng một ứng dụng với các cấu hình khác nhau tions, bạn có thể sử dụng các cấu lò xo, nếu đó là trường hợp bạn có thể chú thích một lớp hoặc phương pháp như thế này:

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

Các mặt hàng này được rất nhiều công việc phụ kể từ khi tôi cần phải vô hiệu hóa/kích hoạt tất cả các công việc cùng một lúc, kiểm tra câu trả lời của tôi –

+3

'@ ConditionalOnProperty' sẽ không có hiệu lực trên phương thức' @ Scheduled' như mọi điều kiện, nó chỉ ảnh hưởng đến đăng ký bean. Xem javadoc để biết thêm chi tiết: http://docs.spring.io/spring-framework/docs/4.3.2.RELEASE/javadoc-api/org/springframework/context/annotation/Conditional.html?is-external=true –

+0

xấu của tôi và cảm ơn cho sự điều chỉnh, tôi chỉ cần chỉnh sửa câu trả lời :) – imTachu

Các vấn đề liên quan