簡體   English   中英

C#Rabbit MQ未確認消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM