[英]c# Rabbit MQ Unacked messages
嘗試發送ACK從Rabbit隊列中刪除消息時遇到問題。
Rabbit MQ版本:3.6.15。 RabbitClient 5.0.1的版本
這是我的代碼:
var conn = Factory.CreateConnection();
var channel = conn.CreateModel();
//inside loop
var data = Get(conn, channel);
if (data == null)
return true;
if (data.MessageCount == 0)
return true;
var rabbitShortAd = JsonConvert.DeserializeObject<ShortAdRabbit>(Encoding.UTF8.GetString(Decompress(data.Body)));
//Process rabbitShortAd, save it in DB
//And if no error, send ack
SendAck(data, conn, channel);
return false;
//end loop
public static BasicGetResult Get(IConnection conn, IModel channel)
{
if (conn == null || !conn.IsOpen)
conn = Factory.CreateConnection();
if (channel == null || !channel.IsOpen)
channel = conn.CreateModel();
var queueName = "descriptions";
channel.QueueDeclare(queue: queueName, durable: true, exclusive: false, autoDelete: false);
return channel.BasicGet(queueName, false);
}
private static void SendAck(BasicGetResult data)
{
if (conn == null || !conn.IsOpen)
conn = Factory.CreateConnection();
if (channel == null || !channel.IsOpen)
channel = conn.CreateModel();
channel.BasicAck(data.DeliveryTag, false);
}
從隊列中刪除第一個處理的消息,然后所有其他消息堆疊在unacked列中。 我的管理員系統剛剛告訴我他將Rabbit MQ版本更新為3.6.15,現在我無法確認我的消息了。 代碼有問題嗎?
找到了使它工作的等待。
我必須實例化循環內的連接和模型,然后再關閉內部的每個連接/模型。
//inside the loop
var conn = Factory.CreateConnection();
var channel = conn.CreateModel();
try
{
var data = Get(conn, channel);
//Process
channel.BasicAck(data.DeliveryTag, false);
}
catch(Exception e)
{
//handle e
}
finally
{
conn?.Close();
channel?.Close();
}
//end of loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.