5

के साथ गतिशील कॉन्फ़िगरेशन एक सदस्यता सबस्क्राइब चैनल पर उपभोक्ताओं की एक श्रृंखला में RabbitMQ कनेक्शन चश्मा की सूची से जाने का सही तरीका क्या है?वसंत एकीकरण

है, कहते हैं कि मैं खरगोश config के रूप में निम्नानुसार है:

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

मैं एक @NestedConfigurationProperty List<RabbitConfiguration> में इन मार्शल।

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

मैं तो अनिवार्य रूप से है कि मैप कर सकते हैं एक IntegrationFlow लिए:

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

क्या, तथापि, है मैं एक @Bean विधि है कि मुझे उन List<RabbitConfiguration> में से एक से एक AmqpTemplate मिलती है, इसलिए प्रकार लिख सकते हैं List<RabbitConfiguration> के लिए ऐसा करने का सही तरीका है और परिणामस्वरूप List<IntegrationFlow> वसंत द्वारा संभाला गया है? निश्चित रूप से यह बस नहीं है:

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

उत्तर

0

मुझे लगता है कि तुम क्या करने की कोशिश कर रहे हैं आपके विन्यास गुणों के आधार पर IntegrationFlow गतिशील प्रकार के वसंत सेम तैयार करना है। आपके पास "जादू" या "पारदर्शी" होने के आधार पर आपके पास कितने विकल्प हैं। यदि आप पूर्ण जादू चाहते हैं तो आपको एक बीनफैक्टरीपोस्टप्रोसेसर को लागू करना होगा और वसंत संदर्भ में पंजीकरण करना होगा। कुछ इस तरह काम करना चाहिए:

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

तो फिर तुम में होस्ट नाम से प्रत्येक एकीकरण प्रवाह इंजेक्षन करने में सक्षम हो जाएगा:

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

तो फिर आप अपने विन्यास कक्षा में पोस्ट प्रोसेसर रजिस्टर करना होगा @Qualifier का उपयोग कर अन्य बीन्स, या संग्रह के रूप में, List<IntegrationFlow> कहें वसंत संदर्भ में मौजूद सभी एकीकरण प्रवाह के साथ।

संबंधित मुद्दे