【发布时间】:2013-11-20 11:46:12
【问题描述】:
查看更新
我在本地机器上安装了 RabbitMQ,可以毫无问题地排队消息。
我正在使用 RabbitMQ 批准的 .NET 客户端库。
在将消息出列并成功处理后,我们的计划是使用 BasicAck 确认消息并传递 DeliveryTag。这似乎不起作用,因为消息都返回到就绪状态。
在 BasicGet 之后查看 DeliveryTag 的值始终为 1。我确信这是错误的,因为我怎么可能将该标签传递回 BasicAck 并期望一条消息被唯一标识。
我做错了什么? DeliveryTag 应该是唯一的引用,而不是“1”是吗?
更新
我每次都在重新创建 Channel,因此对 BasicGet 的调用和对 BasicAck 的调用在不同的 Channel 上。一旦我重用了频道,消息就会成功地通过 Ready -> Uacked -> Off the Q。
FWIW DeliveryTag 仍然是 1
除非有人想告诉我我不应该重复使用频道,否则我认为现在已经回答了。我知道重用 Channels 可能会出现多线程问题。
谢谢
拍拍
【问题讨论】:
-
其实delivery-tag=1的意思是“最多并包括”(见rabbitmq.com/amqp-0-9-1reference.html#basic.ack.delivery-tag),所以一般情况下还是可以确认消息的,但是整个情况有点奇怪,可能是.NET伙计们提供更多细节?
-
当我们调用 channel.BasicGet 时,我将 false 传递给 noAck,所以我认为“你是否使用自动确认”是一个否定。如果我们传递 true,DeliveryTag 仍然为 1,但消息离开队列。查看文档,multiple = 1 似乎意味着“最多并包括”而不是 DeliverTag。 rabbitmq.com/amqp-0-9-1-reference.html。我需要在同一个通道和连接上出列和 BadsicAclk 吗?