2013-08-30 11 views
5

RabbitMQ के Channel#basicConsume विधि हमें निम्नलिखित तर्क देता है:RabbitMQ: प्रकाशित करने के लिए कतार निर्दिष्ट कैसे करें?

channel.basicConsume(queueName, autoAck, consumerTag, noLocal, 
    exclusive, arguments, callback); 

हमें वास्तव में कौन-क़तार हम से उपभोग करने के लिए चाहते हैं RabbitMQ बता की क्षमता देना।

channel.basicPublish(exchangeName, routingKey, mandatory, immediateFlag, 
    basicProperties, messageAsBytes); 

मैं कतार क्यों निर्दिष्ट नहीं कर सकते यहां के लिए प्रकाशित करने के लिए:

लेकिन Channel#basicPublish ऐसी कोई समानक है?!? मुझे Channellogging नामक कतार कहने के लिए कैसे प्रकाशित किया जा सकता है? अग्रिम धन्यवाद!

+1

आप जो करना चाहते हैं, वह सीधे कतार के साथ किया जा सकता है, प्रत्यक्ष विनिमय और ज्ञात कतार नाम और किसी भी तरह से विशिष्ट मार्ग कुंजी + विषय विनिमय के साथ किया जा सकता है। – pinepain

+0

धन्यवाद @ zaq178miami (+1) - क्या आप एक कोड उदाहरण प्रदान कर सकते हैं? –

उत्तर

13

मूल रूप से कतारों को रूटिंग के आधार पर एक्सचेंज में जोड़ा जा सकता है।

मान लें कि आपके पास 3 अलग-अलग प्रकाशक हैं।
Publisher1 संदेश भेजने "घटनाओं"
Publisher2 भेजने संदेश routingKey साथ आदान-प्रदान करने के लिए "कार्य"
Publisher3 भेजने संदेश routingKey साथ आदान-प्रदान करने routingKey "नौकरियों"

आप एक उपभोक्ता है कि केवल संदेशों की खपत हो सकता है के साथ आदान-प्रदान करने विशिष्ट routhing के साथ।
क्रम में "घटनाओं" संदेश आप इस

channel.queueBind(queueName, exchangeName, "events"); 

तरह की घोषणा आप सभी संदेशों को विनिमय के रूप में '#' आप मार्ग देने के लिए आ रहा उपभोग करने के लिए चाहते हैं के लिए एक उपभोक्ता के लिए उदाहरण के लिए

तो संक्षेप में मैं क्या कह सकता हूं,
1. संदेश एक एक्सचेंज में प्रकाशित किए जाएंगे।
2. पंक्तियों को रूटिंग के आधार पर विनिमय करने के लिए बाध्य किया जाएगा।
3. RabbitMQ संबंधित पंक्तियों से मिलान करने वाली रूटिंग कुंजियों के साथ संदेश अग्रेषित करेगा।

कृपया ट्यूटोरियल देखते हैं - http://www.rabbitmq.com/tutorials/tutorial-three-java.html

RabbitMQ में संदेश भेजने के मॉडल में मुख्य विचार यह है कि निर्माता एक कतार में सीधे किसी भी संदेश भेजता है कभी नहीं है। दरअसल, अक्सर निर्माता यह भी नहीं जानता कि किसी भी कतार में कोई संदेश वितरित किया जाएगा या नहीं। इसके बजाए, निर्माता केवल

+0

बहुत बढ़िया @ जॉन (+1 और हरे रंग की जांच) के लिए उपयोगी नहीं हैं - उपयोगी, गहन और सूचनात्मक उत्तर के लिए धन्यवाद! –

0

इस प्रयास करें:

channel.basicPublish("", yourQueueName, null, 
     message.getBytes((Charset.forName("UTF-8")))); 

यह मेरा परियोजना के लिए काम किया।

+1

धन्यवाद @tien nguyen (+1) - हालांकि, ऐसा लगता है कि आप ['मूल प्रकाशन (java.lang.String एक्सचेंज, java.lang.String routingKey, AMQP.BasicProperties props, बाइट [] body) का उपयोग कर रहे हैं '] (http://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.2/rabbitmq-java-client-javadoc-1.7.2/com/rabbitmq/client/Channel.html#basicPublish%28java.lang। स्ट्रिंग,% 20java.lang.String,% 20com.rabbitmq.client.AMQP.BasicProperties,% 20byte []% 2 9) 'basicPublish 'का अधिभार। उस अधिभार में, दूसरा पैरामीटर (जो आपके पास "yourQueueName" है, उसे "रूटिंगकी" कहा जाता है। तो, "रूटिंग नाम" के लिए "रूटिंगकि" रेबिटएमक्यू लिंगो है? –

+0

@ टिकट मॉन्स्टर रूटिंगकी का मतलब कतार नहीं है। एक कतार बाध्य होगी रूटिंग के आधार पर एक एक्सचेंज के लिए और केवल उन्हीं संदेशों को प्राप्त होगा जिनके पास रूटिंग है। मेरा जवाब देखें। –

+0

थोड़ा और विस्तार से संदेश डिफ़ॉल्ट एक्सचेंज पर भेजा जाता है ताकि रूटिंग कुंजी प्रभावी रूप से कतार को भेजी जाएगी। लेकिन नहीं समतुल्य – robthewolf

10

@Tien Nguyen के उत्तर पर विस्तार करने के लिए संदेश भेज सकता है, RabbitMQ में "धोखा" है जो प्रभावी रूप से आपको सीधे कतार में प्रकाशित करने देता है। कतार के नाम के साथ रूटिंग कुंजी के रूप में प्रत्येक कतार स्वचालित रूप से AMQP डिफ़ॉल्ट विनिमय से जुड़ी होती है। डिफ़ॉल्ट विनिमय को "नामहीन विनिमय" के रूप में भी जाना जाता है - यानी इसका नाम खाली स्ट्रिंग है। इसलिए यदि आप अपने कतार के नाम के बराबर रूटिंग कुंजी के साथ "" नामक एक्सचेंज पर प्रकाशित करते हैं, तो संदेश केवल उस कतार पर जाएगा। यह एक एक्सचेंज के माध्यम से जा रहा है क्योंकि जॉन ने कहा, यह सिर्फ इतना नहीं है कि आपको खुद को घोषित करने या बांधने की आवश्यकता है।

मेरे पास जावा क्लाइंट इस कोड को आजमाने के लिए आसान नहीं है, लेकिन इसे काम करना चाहिए।

channel.basicPublish("", myQueueName, false, false, null, myMessageAsBytes); 

यह कहा गया है कि यह ज्यादातर खरगोशएमक्यू कैसे काम करता है इस भावना के विपरीत है। सामान्य आवेदन प्रवाह के लिए आपको एक्सचेंज घोषित करना और बाध्य करना चाहिए। लेकिन असाधारण मामलों के लिए "धोखा" उपयोगी हो सकता है। उदाहरण के लिए, मेरा मानना ​​है कि इस प्रकार खरगोश एडमिन कंसोल आपको एक्सचेंज बनाने और बाध्य करने के सभी समारोहों के बिना संदेशों को मैन्युअल रूप से कतार में प्रकाशित करने की अनुमति देता है।

+0

क्या यह धोखा कार्य भी करेगा यदि कतार भी विनिमय के लिए बाध्य है? –

+0

हाँ, यह होगा, हमारे पास कोड होगा यह उन कतारों के लिए करता है जो अन्य एक्सचेंजों से बंधे हैं। –

+0

कमाल। वास्तव में मुझे स्वचालित परीक्षण के लिए क्या चाहिए। धन्यवाद –

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