RabbitMQ server认为自己已经投递了消息,RabbitMQ client不同意

RabbitMQ server thinks that it has delivered messages, RabbitMQ client disagrees

我正在使用 RabbitMQ 将消息传递给工作进程(使用官方 C# 客户端)。我在实施过程中进行了 运行 简单的测试,到目前为止一切顺利。

我 运行 一个测试,我在其中为未侦听(无连接)的工作进程排队消息。一旦我排队了数百条消息,我就开始了这个过程。它创建了它的 IModel,声明了它的队列(已经存在),并开始使用消息(使用 BasicConsume)。这很顺利。此过程在处理消息时为其他队列创建消息。已经有进程在监听这些队列(使用 BasicConsume),因此消息会立即传递给那些客户端(或者服务器认为...)。消息永远不会被处理。

服务器肯定认为消息已经送达(消息都在"unacked"桶,而不是"ready"桶),但是 IBasicConsumer.HandleBasicDeliver 从未在客户端调用过。 我尝试了几种不同的技术(使用订阅、使用 QueueingBasicConsumer 以及我自己的自定义消费者),结果正是相同的。我完全不知所措。如果我关闭连接(这里只有一个连接),那么消息会立即从 "unacked" 存储桶移动到 "ready" 存储桶。

为什么在发送消息时客户端没有收到通知?

查看代码,ModelBase.Close() 调用 ConsumerDispatcher.Shutdown()(ModelBase.cs 行 301),然后从那里调用 workService.StopWork()(ConcurrentConsumerDispatcher.cs第 27 行)。在我看来(通过粗略地查看代码)这会停止连接的 ConsumerWorkService 中的所有工作。相反,ConcurrentConsumerDispatcher.Shutdown() 应该在第 27 行调用 workService.StopWork(this) 吗?

如果您的 BasicConsume 定义了 noAck = false,在您 Dequeues 消息后需要 运行 下一个代码:channel.BasicAck(result.DeliveryTag, false);

如果您的 BasicConsume 定义了 noAck = true,在您将消息出列后,它会自动从服务器中删除。

这是 RabbitMQ 客户端中的一个错误,需要修复 has already been merged in

它应该在 2015 年 4 月 18 日的下一个夜间版本中可用。