2011-10-31 11 views
9

"टिकाऊ" और "लगातार मोड" संदेश प्राप्त करने के लिए कोई ग्राहक होने के बजाय रीबूट से संबंधित प्रतीत होता है।कोई ग्राहक के साथ RabbitMQ कतार

मुझे कोई ग्राहक नहीं होने पर रब्बीएमक्यू को कतार पर संदेश रखने की इच्छा है। जब कोई ग्राहक ऑनलाइन आ जाता है, तो संदेश उस ग्राहक द्वारा प्राप्त किया जाना चाहिए। क्या यह RabbitMQ के साथ संभव है?

कोड का नमूना:

सर्वर:

namespace RabbitEg 
{ 
    class Program 
    { 
     private const string EXCHANGE_NAME = "helloworld"; 

     static void Main(string[] args) 
     { 
      ConnectionFactory cnFactory = new RabbitMQ.Client.ConnectionFactory() { HostName = "localhost" }; 

      using (IConnection cn = cnFactory.CreateConnection()) 
      { 
       using (IModel channel = cn.CreateModel()) 
       { 
        //channel.ExchangeDelete(EXCHANGE_NAME); 
        channel.ExchangeDeclare(EXCHANGE_NAME, "direct", true); 
        //channel.BasicReturn += new BasicReturnEventHandler(channel_BasicReturn); 

        for (int i = 0; i < 100; i++) 
        { 
         byte[] payLoad = Encoding.ASCII.GetBytes("hello world _ " + i); 
         IBasicProperties channelProps = channel.CreateBasicProperties(); 
         channelProps.SetPersistent(true); 

         channel.BasicPublish(EXCHANGE_NAME, "routekey_helloworld", false, false, channelProps, payLoad); 

         Console.WriteLine("Sent Message " + i); 
         System.Threading.Thread.Sleep(25); 
        } 

        Console.ReadLine(); 
       } 
      } 
     } 
    } 
} 

ग्राहक:

namespace RabbitListener 
{ 
    class Program 
    { 
     private const string EXCHANGE_NAME = "helloworld"; 

     static void Main(string[] args) 
     { 
      ConnectionFactory cnFactory = new ConnectionFactory() { HostName = "localhost" }; 

      using (IConnection cn = cnFactory.CreateConnection()) 
      { 
       using (IModel channel = cn.CreateModel()) 
       { 
        channel.ExchangeDeclare(EXCHANGE_NAME, "direct", true); 

        string queueName = channel.QueueDeclare("myQueue", true, false, false, null); 
        channel.QueueBind(queueName, EXCHANGE_NAME, "routekey_helloworld"); 

        Console.WriteLine("Waiting for messages"); 

        QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel); 
        channel.BasicConsume(queueName, true, consumer); 

        while (true) 
        { 
         BasicDeliverEventArgs e = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); 
         Console.WriteLine(Encoding.ASCII.GetString(e.Body)); 
        } 
       } 
      } 
     } 
    } 
} 

उत्तर

12

durable और persistent क्या मतलब के लिए स्पष्टीकरण AMQP Reference देखें।

असल में, कतार या तो durable या non-durable हैं। पूर्व जीवित दलाल फिर से शुरू होता है, उत्तरार्द्ध नहीं करता है।

संदेश transient या persistent के रूप में प्रकाशित किए गए हैं। विचार यह है कि persistentdurable कतारों पर संदेश ब्रोकर पुनरारंभ से बचने चाहिए।

तो, आप जो चाहते हैं उसे प्राप्त करने के लिए, आपको कतार को durable और 2 के रूप में घोषित करने की आवश्यकता है) संदेशों को persistent के रूप में प्रकाशित करें। इसके अलावा, आप चैनल पर प्रकाशक को सक्षम करना भी सक्षम कर सकते हैं; इस तरह, आपको पता चलेगा कि ब्रोकर ने संदेश की ज़िम्मेदारी कब ली है।

+0

धन्यवाद, मैंने यह कोशिश की है लेकिन अगर कोई ग्राहक सुन रहा है तो यह अभी भी संदेश जारी नहीं रखता है। प्रश्न से जुड़ा कोड नमूना। –

+0

अच्छा कोड। दो समस्याएं: 1) सर्वर * कतार घोषित करना चाहिए; इसे दो बार घोषित करना कोई समस्या नहीं है और यह अच्छी प्रथा है और 2) queueDeclare() आपको एक अज्ञात गैर-टिकाऊ कतार देता है; आप queueDeclare ("myQueue", सच, झूठी, झूठी, शून्य) चाहते हैं। – scvalex

+0

इसके अलावा, जिस तरह से आपने प्रश्न संपादित किया है, उसे समझना मुश्किल हो जाता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। – scvalex

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