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 日的下一个夜间版本中可用。
我正在使用 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 日的下一个夜间版本中可用。