2015-09-10 20 views
5

Cách nào để đi từ danh sách thông số kết nối RabbitMQ đến một loạt người tiêu dùng trên kênh đăng ký xuất bản?Cấu hình động với Spring Integration

Nghĩa là, nói rằng tôi có thỏ cấu hình như sau:

rabbits: 
    - hostname: blahblah 
     vhost: blahlbah 
     username: blahlbah 
     password: blahlbalh 
     exchange: blahblah 
    - hostname: blahblah1 
     vhost: blahlbah1 
     username: blahlbah1 
     password: blahlbalh1 
     exchange: blahblah1 
    ... 

tôi marshal những thành @NestedConfigurationProperty List<RabbitConfiguration>. Tôi có thể viết một phương pháp @Bean mà được cho tôi một AmqpTemplate từ một trong những List<RabbitConfiguration>, như vậy:

@Bean 
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
public AmqpTemplate amqpTemplate(RabbitConfiguration rabbitConfiguration) { 
    ... 
} 

tôi có thể sau đó về cơ bản bản đồ đó để một IntegrationFlow:

@Bean 
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) 
public IntegrationFlow integrationFlow(AmqpTemplate amqpTemplate) { 
    return IntegrationFlows.from(inboundPubSubChannel()).handle(Amqp.outboundAdapter(amqpTemplate)).get(); 
} 

gì, tuy nhiên, là đúng cách để làm điều này cho một số List<RabbitConfiguration> và có kết quả là List<IntegrationFlow> do Spring xử lý? Chắc chắn nó không chỉ là:

@Bean 
public List<IntegrationFlow> integrationFlows(List<RabbitConfiguration> rabbitConfigurations) { 
    return rabbitConfigurations.stream() 
     .map(this::amqpTemplate) 
     .map(this::integrationFlow) 
     .collect(toList()) 
} 

Trả lời

0

Tôi nghĩ rằng những gì bạn đang cố gắng làm là để tự động tạo ra đậu mùa xuân loại IntegrationFlow dựa trên thuộc tính cấu hình của bạn. Có rất nhiều tùy chọn bạn có tùy thuộc vào cách "ma thuật" hoặc "minh bạch" bạn muốn nó được. Nếu bạn muốn phép thuật đầy đủ, bạn phải thực hiện BeanFactoryPostProcessor và đăng ký trong bối cảnh Spring. Something như thế này nên làm việc:

public class IntegrationFlowPostProcessor implements BeanFactoryPostProcessor{ 

    List<RabbitConfiguration> rabbitConfigurations; 

    public IntegrationFlowPostProcessor(List<RabbitConfiguration> rabbitConfigurations) { 
    this.rabbitConfigurations = rabbitConfigurations; 
    } 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
    rabbitConfigurations.stream() 
     .forEach(rabbitConfig -> { 
      IntegrationFlow intFlow = integrationFlow(amqpTemplate(rabbitConfig)); 
      beanFactory.registerSingleton(rabbitConfig.getHostanme(), intFlow); 
     }); 
    } 

    private AmqpTemplate amqpTemplate(RabbitConfiguration rabbitConfiguration) { 
    //Implement here 
    return null; 
    } 

    private IntegrationFlow integrationFlow(AmqpTemplate amqpTemplate) { 
    //Implement here 
    return null; 
    } 
} 

Sau đó, bạn sẽ phải đăng ký xử lý bài trong lớp cấu hình của bạn:

@Bean public IntegrationFlowPostProcessor ifpp(List<RabbitConfiguration> config { 
    return new IntegrationFlowPostProcessor(config); 
} 

Sau đó, bạn sẽ có thể tiêm mỗi dòng chảy hội nhập bởi hostname vào các hạt khác sử dụng @Qualifier hoặc dưới dạng tập hợp, giả sử List<IntegrationFlow> với tất cả các luồng tích hợp có trong ngữ cảnh Mùa xuân.

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