RabbitMQ消費端消息的獲取方式


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

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

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

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

2【長鏈接】:  

  1)、EventingBasicConsumer【訂閱式】

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

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

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

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

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

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

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

            QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
            channel.BasicConsume("headersQueue", false, consumer);
            while (true)
            {
                var result = consumer.Queue.Dequeue();
                if(result != null)
                {
                    Console.WriteLine(Encoding.UTF8.GetString(result.Body));
                    channel.BasicAck(result.DeliveryTag, false);
                }
            }

  出自:https://www.cnblogs.com/fanqisoft/p/10398340.html


免責聲明!

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



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