2011-11-04 11 views
7

मैं एक wcf सेवा लिखने की कोशिश कर रहा हूं जो खरगोश एमक्यू बाध्यकारी पर काम करता है। मैं सफलतापूर्वक एक सर्वर और एक क्लाइंट बनाने में सक्षम था और क्लाइंट कतार के माध्यम से सर्वर को संदेश भेजता है। मैं लगभग 2 मुद्दों पर उलझन में हूं।डब्ल्यूसीएफ के साथ खरगोश एमक्यू और एक लगातार कतार

  1. जैसे ही सेवा बंद हो जाती है कतार हटा दी जाती है। क्या डब्ल्यूसीएफ और खरगोश एमक्यू को कॉन्फ़िगर करने का कोई तरीका है ताकि कतार लगातार हो? अगर मेरा सर्वर क्रैश हो जाता है तो इस तरह मुझे डेटा खोने की चिंता करने की ज़रूरत नहीं है।

  2. मैं कतार के नाम को नियंत्रित नहीं कर सकता। जब मैं rabbitmqctl.bat list_queues चलाता हूं तो मुझे लगता है कि कतार को amq.gen-3IgZD30XvTEQWNRsezSUUA== कहा जाता है। कतार के नाम को नियंत्रित करने का कोई तरीका है?

उत्तर

9

यह डब्ल्यूसीएफ बाइंडिंग के साथ नहीं किया जा सकता है। विवरण के लिए this मेलिंग सूची धागा देखें।

मूल रूप से, आप WCF के माध्यम से कतार नाम नियंत्रित नहीं कर सकते, जिसका अर्थ है आप गुमनाम कतार, जो, बारी में, इसका मतलब है कि आप केवल उपयोग कर सकते हैं (एक आप देख रहे हैं की तरह) तक ही सीमित हैं गैर लगातार कतारों।

आप से WCF बाइंडिंग द्वारा की पेशकश की है और अधिक नियंत्रण की जरूरत है, तो आप पूरी नेट क्लाइंट का उपयोग पर विचार करना चाहिए। यह उपयोग करने के लिए काफी आसान है, और tutorials का एक समूह शुरू करने में सहायता करने के लिए देखते हैं (वे जावा में हैं, लेकिन नेट एपीआई बहुत समान है)।

+4

धन्यवाद। यही वह जवाब है जिसे मैं ढूंढ रहा था। यह मूल रूप से बनाता है यह व्यर्थ भले ही यह आप इस पर नियंत्रण नहीं दे सकता एक WCF RabbitMQ के लिए बाध्यकारी है। –

5

मैं एक ही समस्या थी के रूप में आप से किया था और क्या मैंने किया था rabbitMQDotNetClient के स्रोत कोड को संपादित करने के लिए किया गया था।

फ़ाइल: RabbitMQInputChannel.cs

public override void Open(TimeSpan timeout) 
    {    
     if (State != CommunicationState.Created && State != CommunicationState.Closed) 
      throw new InvalidOperationException(string.Format("Cannot open the channel from the {0} state.", base.State)); 

     OnOpening(); 
#if VERBOSE 
     DebugHelper.Start(); 
#endif 
     //Create a queue for messages destined to this service, bind it to the service URI routing key 
#if USE_DEFINED_QUEUE_NAMES 
     //here we create a queue that uses the name given in the service address in the wcf binding. 
     //if the address in the web.config is: soap.amq:///QueueName 
     //the name of the queue will be: QueueName 
     //LVV 
     string queue = m_model.QueueDeclare(base.LocalAddress.Uri.PathAndQuery, true, false, false, null); 
#else 
     string queue = m_model.QueueDeclare(); 
#endif 
     m_model.QueueBind(queue, Exchange, base.LocalAddress.Uri.PathAndQuery, null); 

     //Listen to the queue 
     m_messageQueue = new QueueingBasicConsumer(m_model); 
     m_model.BasicConsume(queue, false, m_messageQueue); 

#if VERBOSE 
     DebugHelper.Stop(" ## In.Channel.Open {{\n\tAddress={1}, \n\tTime={0}ms}}.", LocalAddress.Uri.PathAndQuery); 
#endif 
     OnOpened(); 
    } 

संकलित झंडा USE_DEFINED_QUEUE_NAMES साथ। यह आपके app.config या web.config फ़ाइल में दिए गए नाम के साथ एक कतार का नाम बनाएगा। तुम हमेशा QueueDeclare (...) यदि आप अपने कतारों लोगों मैं बना रहा हूं की तुलना में अलग तरह से व्यवहार करना चाहते हैं पर कतारों विकल्प बदल सकते हैं। चीयर्स!