将 Rebus 与 RabbitMQ 独占队列一起使用时出错

Error when using Rebus with RabbitMQ exclusive queues

我在尝试使用 Rebus 响应 RabbitMQ 独占队列时遇到以下异常。

-       e   {"Queue 'xxxx-xxxx' does not exist"}    Rebus.Exceptions.RebusApplicationException

+       InnerException  {"The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=405, text=\"RESOURCE_LOCKED - cannot obtain exclusive access to locked queue 'xxxx-xxxx' in vhost '/'. It could be originally declared on another connection or the exclusive property value does not match that of the original d...\", classId=50, methodId=10, cause="} System.Exception {RabbitMQ.Client.Exceptions.OperationInterruptedException}

客户端将队列声明为独占,并能够成功将消息发送到服务器。服务器处理消息但在发送响应时抛出异常。

我可以在 Rebus 源代码 (Rebus.RabbitMq.RabbitMqTransport.cs) 中看到它尝试 model.QueueDeclarePassive(queueName) 抛出上述异常。

我找到了下面的语句Here

RabbitMQ extends the exclusivity to queue.declare (including passive declare), queue.bind, queue.unbind, queue.purge, queue.delete, basic.consume, and basic.get

将 CheckQueueExistence 方法中的 Rebus 源修改为 return true 允许发送响应消息。所以我的问题是,这是 Rebus 中在独占队列上使用被动声明的问题,RabbitMQ 是否阻止了调用,或者我是否缺少一个基本概念?

Rebus 做 model.QueueDeclarePassive(queueName) 事情的原因是因为它试图通过在发送之前验证目标队列的存在来帮助您。

这是为了避免发件人去的情况

using var bus = Configure.With(...)
    .(...)
    .Routing(r => r.TypeBased().Map<string>("does-not-exist"))
    .Start();

await bus.Send("I'M LOST ");

然后消息丢失了。

这里的问题是 RabbitMQ 仍然使用路由键将发送的消息与指向队列的绑定相匹配,如果不存在匹配的绑定(即使使用 DIRECT 交换类型),消息将简单地路由到0个队列,因此它丢失了。

如果您提交的 PR 可以配置是否检查目标队列是否存在,那么我很乐意(帮助您正确处理并)接受它。