【问题标题】:c# Rabbit MQ Unacked messagesc# Rabbit MQ Unacked 消息
【发布时间】:2018-07-30 16:57:25
【问题描述】:

我在尝试发送 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);
}

处理的第一条消息从队列中删除,然后所有其他消息都堆叠在未确认的列中。我的管理系统刚刚告诉我他将 Rabbit MQ 版本更新到 3.6.15,现在我无法确认我的消息。代码有问题吗?

【问题讨论】:

  • 如果消息率增加,此代码和您在答案中提供的代码将非常低效。您应该创建连接、通道并在循环之外执行QueueDeclare outside,并使用BasicGetBasicConsume(带有预取)来接收消息。我建议查看我们的教程 - rabbitmq.com/tutorials/tutorial-three-dotnet.html。仅供参考,RabbitMQ 团队监控 this mailing list 并且有时只在 StackOverflow 上回答问题。
  • 感谢您的留言,稍后我会带着您的建议提供另一个工作代码。

标签: c# .net rabbitmq message-queue


【解决方案1】:

发现等待让它工作。

我必须在循环内实例化连接和模型,然后也关闭其中的每个连接/模型。

//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

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2018-03-02
    • 2020-06-24
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多