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