2015-09-10 30 views
5

Bir yayın abonelik kanalında bir dizi tüketiciye RabbitMQ bağlantı özelliklerinin listesinden gitmek için doğru yol hangisidir? olduğuYay Entegrasyonu ile dinamik yapılandırma

, şöyle tavşan yapılandırma olduğunu varsayalım: Bir @NestedConfigurationProperty List<RabbitConfiguration> içine bu sıralamakta

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

.

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

Sonra esasen bir IntegrationFlow o eşleyebilirler:

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

Ne Ancak, I, bana bu List<RabbitConfiguration> birinden bir AmqpTemplate alır şöyle bir @Bean yöntem yazabilirsiniz Bunu bir List<RabbitConfiguration> için doğru şekilde yapmak ve ortaya çıkan List<IntegrationFlow> ilkbahar tarafından işlenecek mi? Şüphesiz bu sadece değil:

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

cevap

0

Ben ne yapmaya çalışıyoruz yapılandırma özelliklerine göre IntegrationFlow dinamik tip Bahar fasulye oluşturmak için olduğunu düşünüyorum. Olmak istediğiniz "büyü" veya "şeffaf" ne bağlı olarak birçok seçenek var. Tam bir sihir istiyorsanız, bir BeanFactoryPostProcessor uygulamak ve Bahar bağlamında kayıt olmanız gerekir. Böyle şey çalışması gerekir:

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

Sonra içine hostname tarafından her entegrasyon akışını enjekte etmek mümkün olurdu:

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; 
    } 
} 

Sonra yapılandırma sınıfında sonrası işlemci kayıt gerekecek @Qualifier kullanarak diğer çekirdekler, ya da bir koleksiyon olarak, Bahar bağlamında mevcut tüm entegrasyon akışları ile List<IntegrationFlow> diyelim.