【发布时间】: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,现在我无法确认我的消息。代码有问题吗?
【问题讨论】:
-
如果消息率增加,此代码和您在答案中提供的代码将非常低效。您应该创建连接、通道并在循环之外执行
QueueDeclareoutside,并使用BasicGet或BasicConsume(带有预取)来接收消息。我建议查看我们的教程 - rabbitmq.com/tutorials/tutorial-three-dotnet.html。仅供参考,RabbitMQ 团队监控 this mailing list 并且有时只在 StackOverflow 上回答问题。 -
感谢您的留言,稍后我会带着您的建议提供另一个工作代码。
标签: c# .net rabbitmq message-queue