RabbitMQ服务器认为它已经发送了消息,RabbitMQ客户端不同意

时间:2015-04-16 16:45:49

标签: c# rabbitmq amqp

我使用RabbitMQ向工作进程传递消息(使用官方C#客户端)。我在实施过程中一直在进行简单的测试,直到现在一直都在游泳。

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

服务器肯定认为邮件已经发送(邮件全部在#34;未包装"存储桶中,而不是"准备好"存储桶),但是 IBasicConsumer.HandleBasicDeliver从未在客户端上被调用。我尝试了几种不同的技术(使用Subscription,使用QueueingBasicConsumer以及我自己的自定义消费者),结果完全相同。我完全失败了。如果我关闭连接(这里只有一个连接),那么消息会立即从" unacked"桶到"准备好"桶"

为什么在发送邮件时不会通知客户端?

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

2 个答案:

答案 0 :(得分:2)

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

应该会在2015年4月18日的下一个夜间版本中提供。

答案 1 :(得分:0)

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

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