2015-02-14 13 views
8

मेरे पास तीन क्लाइंट हैं जिनमें से प्रत्येक अपने स्वयं के खरगोश एमक्यू उदाहरण हैं और मेरे पास एक एप्लिकेशन है (चलिए इसे एपीए कहते हैं) जिसमें इसका अपना खरगोश एमक्यू उदाहरण है, तीन क्लाइंट एप्लिकेशन (एप 1, एप 2, एप 3) चाहता है एपीए पर एक सेवा का उपयोग करें।कई खरगोशों में खरगोश एमक्यू आरपीसी एमक्यू उदाहरण

एपीए की सेवा के लिए आरपीसी संचार, एप 1, ऐप 2 और एप 3 की आवश्यकता है प्रत्येक के पास बुकिंग है। रिक्वेस्ट कतार और बुकिंग। प्रतिक्रिया कतार।

enter image description here

फावड़ा प्लगइन के साथ

, मैं अप्पा को app1-3 से सभी booking.request संदेशों को अग्रेषित कर सकते हैं:

Shovel1 
virtualHost=appA, 
name=booking-request-shovel, 
sourceURI=amqp://userForApp1:[email protected]/vhostForApp1 
queue=booking.request 
destinationURI=amqp://userForAppA:[email protected]/vhostForAppA 
queue=booking.request 

setup another shovel to get booking requests from app2 and app3 to appA in the same way as above. 

अब अप्पा booking.response कतार पर अनुरोध का जवाब देगा, मुझे सही बुकिंग पर वापस जाने के लिए rabbitMQ-appA पर बुकिंग प्रतिक्रिया संदेश की आवश्यकता है। ऐप 1, ऐप 2 या ऐप 3 पर प्रतिक्रिया कतार, लेकिन उन सभी के लिए नहीं - मैं rabbitMQ-appA पर एक फावड़ा/संघीय कतार कैसे स्थापित करूं प्रतिक्रिया को सही खरगोश एमक्यू (एप 1, एप 2, एपी 3) पर वापस भेज दें जो उनकी बुकिंग में प्रतिक्रिया की उम्मीद कर रहा है। प्रतिक्रिया q ueue?

इन सभी क्षुधा वसंत-AMQP (मामले कि प्रासंगिक है में) उपयोग कर रहे हैं वैकल्पिक रूप से, मैं सेटअप वसंत में एक RabbitMQ टेम्पलेट कि कई RabbitMQ कतारों को सुनता है और उनमें से प्रत्येक से खपत कर सकते थे।

डॉक्स से, यह है कि क्या एक विशिष्ट उपभोक्ता लगता है:

<rabbit:listener-container connection-factory="rabbitConnectionFactory"> 
    <rabbit:listener queues="some.queue" ref="somePojo" method="handle"/> 
</rabbit:listener-container> 

यह भले ही कनेक्शन कारखानों RabbitMQ का एक ही उदाहरण के लिए कर रहे हैं ऐसा करने के लिए एक से अधिक कनेक्शन कारखानों निर्दिष्ट करने के लिए संभव है, लेकिन बस विभिन्न vhosts:

enter image description here

अद्यतन:

जोश के जवाब के आधार पर, मैं कई कनेक्शन कारखानों होगा:

<rabbit:connection-factory 
       id="connectionFactory1" 
       port="${rabbit.port1}" 
       virtual-host="${rabbit.virtual1}" 
       host="${rabbit.host1}" 
       username="${rabbit.username1}" 
       password="${rabbit.password1}" 
       connection-factory="nativeConnectionFactory" /> 

<rabbit:connection-factory 
       id="connectionFactory2" 
       port="${rabbit.port2}" 
       virtual-host="${rabbit.virtual2}" 
       host="${rabbit.host2}" 
       username="${rabbit.username2}" 
       password="${rabbit.password2}" 
       connection-factory="nativeConnectionFactory" /> 

तब मैं SimpleRoutingConnectionFactory का प्रयोग करेंगे दोनों कनेक्शन-कारखानों रैप करने के लिए:

<bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.SimpleRoutingConnectionFactory"> 
    <property name="targetConnectionFactories"> 
     <map> 
      <entry key="#{connectionFactory1.virtualHost}" ref="connectionFactory1"/> 
      <entry key="#{connectionFactory2.virtualHost}" ref="connectionFactory2"/> 
     </map> 
    </property> 
</bean> 

अब जब मैं अपने RabbitMQ टेम्पलेट का ऐलान करते हैं मैं अलग-अलग कनेक्शन कारखानों के बजाय SimpleRoutingConnectionFactory को इंगित होगा:

<rabbit:template id="template" connection-factory="connectionFactory" /> 

... और फिर अस्थायी का उपयोग देर से मैं सामान्य रूप से यह प्रयोग करेंगे के रूप में ...

<rabbit:listener-container 
     connection-factory="connectionFactory" 
     channel-transacted="true" 
     requeue-rejected="true" 
     concurrency="${rabbit.consumers}"> 
     <rabbit:listener queues="${queue.booking}" ref="TransactionMessageListener" method="handle" /> 
</rabbit:listener-container> 

// और संदेश दोनों RabbitMQ उदाहरणों

से खपत होती है ... और ...

@Autowired 
    private AmqpTemplate template; 

    template.send(getExchange(), getQueue(), new Message(gson.toJson(message).getBytes(), properties)); 

// और संदेश को प्रकाशित करता है दोनों कतारों के लिए

क्या मैं सही हूँ?

उत्तर

5

org.springframework.amqp.rabbit.connection पर एक नज़र डालें।AbstractRoutingConnectionFactory। यह आपको विभिन्न vhosts या विभिन्न rabbitmq उदाहरणों के लिए एकाधिक कनेक्शन कारखानों बनाने की अनुमति देगा। हम इसे एक बहु किरायेदार खरगोश आवेदन के लिए उपयोग कर रहे हैं।

+0

सारराउटिंग कनेक्शन कनेक्शन फैक्ट्री वादा करता है, क्या आपके पास इसका उदाहरण है कि आप इसका उपयोग कैसे करते हैं? क्या निर्धारित किया जाता है CurrentLookupKey के लिए इस्तेमाल किया जा रहा है? –

+1

यहां वसंत दस्तावेज़ है। [http://docs.spring.io/spring-amqp/docs/1.3.0.M1/reference/html/amqp.html#routing-connection-factory](http://docs.spring.io/spring- AMQP/docs/1.3.0.M1/संदर्भ/html/amqp.html # मार्ग-कनेक्शन-कारखाना)। अगर आपको उस दस्तावेज़ को पढ़ने के बाद कोई प्रश्न है तो मुझे बताएं। –

+0

दस्तावेज़ के आधार पर, मैंने अपना प्रश्न अपडेट किया है ... संक्षेप में, SimpleRoutingConnectionFactory एकाधिक कनेक्शन कारखानों को लपेटता है और फिर उसी कनेक्शन कारखाने के समान उपयोग किया जा सकता है, क्या यह सही है? –

1

थोड़ा समय हो गया है, लेकिन अगर आप वसंत का उपयोग कर रहे आप अपने स्वयं के विन्यास (मेजबान, उपयोगकर्ता/पास, vhost, आदि) के साथ के रूप में आप चाहते हैं के रूप में कई कनेक्शन कारखानों बना सकते हैं,, जैसे तुमने किया था:

@Bean 
@Primary 
public ConnectionFactory amqpConnectionFactory1() { 
    final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); 

    connectionFactory.setAddresses("..."); 
    connectionFactory.setUsername("..."); 
    connectionFactory.setPassword("..."); 
    connectionFactory.setVirtualHost("..."); 

    return connectionFactory; 
} 

@Bean 
public ConnectionFactory amqpConnectionFactory2() { 
    final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); 

    // ... 

    return connectionFactory; 
} 

और अपने खरगोश व्यवस्थापक/टेम्पलेट के रूप में तुम जाओ:

@Bean 
@Primary 
public RabbitAdmin rabbitAdmin1() { 
    return new RabbitAdmin(amqpConnectionFactory1()); 
} 

@Bean 
public RabbitAdmin rabbitAdmin2() { 
    return new RabbitAdmin(amqpConnectionFactory2()); 
} 

// ... 

@Bean 
@Primary 
public RabbitTemplate rabbitTemplate1() { 
    RabbitTemplate rabbitTemplate = new RabbitTemplate(amqpConnectionFactory1()); 

    // ... 

    return rabbitTemplate; 
} 

@Bean 
public RabbitTemplate rabbitTemplate2() { 
    RabbitTemplate rabbitTemplate = new RabbitTemplate(amqpConnectionFactory2()); 

    // ... 

    return rabbitTemplate; 
} 

नोट है कि आप, एक मुख्य सेम सक्षम करने के लिए एक बार वसंत पता नहीं है @Primary टैग प्रदान करने के लिए जो एक को चुनना ही आपके स्पष्ट रूप से name को सूचित न करें।

हाथों में इस के साथ

, बस उन्हें सामान्य रूप से इंजेक्षन अपने घटकों साथ:

@Autowired 
private RabbitTemplate template; 

// ... 

@Autowired 
@Qualifier("rabbitTemplate2") // Needed when want to use the non-primary bean 
private RabbitTemplate template; 

आशा है कि यह मदद करता है! :)

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