RabbitMQ消費端消息的獲取方式(.Net Core)


1【短鏈接】:BasicGet(String queue, Boolean autoAck)

  通過request的方式獨自去獲取消息,斷開式,一次次獲取,如果返回null,則說明隊列中沒有消息。

    隱患:每次獲取消息都會創建channel。

    優點:最安全的獲取方式且性能不算太差。

2【長鏈接】:  

  1)、EventingBasicConsumer【訂閱式】

  使用這種方式消息會全部打入當前消費者中,不管是否啟用確認機制。

    隱患:①根據消息的長短多少將影響當前消費者的占用資源。

       ②如果當前消費者掛掉,那么未處理的消息將會丟失。

    解決:【QOS + Ack】  服務質量 + 消息確認

        即在channel設置好通道使消息一條一條的從隊列中打過來,確認一條打一條。

 1             //UInt32 prefetchSize,  每次取的長度
 2             //UInt16 prefetchCount,     每次取幾條
 3             //Boolean global    是否對connection通用
 4             channel.BasicQos(0, 1, true);   //https://www.rabbitmq.com/tutorials/tutorial-two-dotnet.html
 5             //使用事件機制獲取消息
 6             EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
 7             consumer.Received += (sender, e) =>
 8             {
 9                 Console.WriteLine(Encoding.UTF8.GetString(e.Body));
10                 channel.BasicAck(e.DeliveryTag, false);
11             };
12             channel.BasicConsume("headersQueue", false, consumer);

 

  2)、QueueingBasicConsumer【死循環】【已過時】

 1             QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
 2             channel.BasicConsume("headersQueue", false, consumer);
 3             while (true)
 4             {
 5                 var result = consumer.Queue.Dequeue();
 6                 if(result != null)
 7                 {
 8                     Console.WriteLine(Encoding.UTF8.GetString(result.Body));
 9                     channel.BasicAck(result.DeliveryTag, false);
10                 }
11             }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM