2011-10-31 24 views
9

"Bền" và "chế độ liên tục" xuất hiện liên quan đến khởi động lại thay vì liên quan đến việc không có người đăng ký nhận tin nhắn.Hàng đợi RabbitMQ không có người đăng ký

Tôi muốn RabbitMQ lưu giữ thư trên hàng đợi khi không có người đăng ký. Khi người đăng ký trực tuyến, tin nhắn sẽ được người đăng ký nhận được. Điều này có thể xảy ra với RabbitMQ không?

mẫu Mã số:

Server:

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

Chủ đầu tư:

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

Trả lời

12

Xem AMQP Reference cho một lời giải thích về những gì durablepersistent có ý nghĩa.

Về cơ bản, hàng đợidurable hoặc non-durable. Các cựu môi giới sống sót khởi động lại, sau này không.

Thư được xuất bản dưới dạng transient hoặc persistent. Ý tưởng là các thông báo persistent trên các hàng đợi durable cũng phải tồn tại khi khởi động lại nhà môi giới.

Vì vậy, để có được những gì bạn muốn, bạn cần phải 1) khai báo hàng đợi là durable và 2) xuất bản thư là persistent. Ngoài ra, bạn cũng có thể muốn cho phép nhà xuất bản xác nhận trên kênh; theo cách đó, bạn sẽ biết khi nào nhà môi giới đã chịu trách nhiệm về thông điệp.

+0

Cảm ơn, tôi đã thử điều này nhưng nó vẫn không tồn tại các tin nhắn nếu không có khách hàng nghe. Mã mẫu được đính kèm với câu hỏi. –

+0

Mã tốt. Hai vấn đề: 1) máy chủ nên * cũng * khai báo hàng đợi; tuyên bố nó hai lần không phải là một vấn đề và đó là thực hành tốt và 2) queueDeclare() cung cấp cho bạn một hàng đợi vô danh không bền; bạn muốn queueDeclare ("myQueue", true, false, false, null). – scvalex

+0

Ngoài ra, cách bạn chỉnh sửa câu hỏi khiến bạn khó hiểu những gì bạn đang cố gắng đạt được. – scvalex

Các vấn đề liên quan