在不提供其所有属性的情况下获取队列

Getting a queue without providing its all properties

我正在尝试为现有队列编写消费者。

RabbbitMQ 运行 在一个单独的实例中,名为 "org-queue" 的队列已经创建并绑定到交换器。 org-queue 是一个持久队列,它还有一些额外的属性。

现在我需要从这个队列接收消息。 我使用下面的代码来获取队列的实例

conn = Bunny.new
conn.start
ch = conn.create_channel    
q = ch.queue("org-queue")

它向我抛出一个错误,指出不同的耐用 属性。默认情况下,Bunny 似乎使用 durable = false。所以我添加了 durable true 作为参数。现在它说明了其他参数之间的区别。我是否需要指定所有参数才能连接到它?由于rabbitMQ由不同的环境维护,我很难得到所有的属性。

有没有办法在客户端获取队列列表并监听所需的队列,而不是通过所有参数连接到队列。

也许有办法用rabbitmqctl或admin工具(我忘了名字)得到它,所以关于队列的信息。就算是,我也懒得理了。

我想到了两种可能的解决方案。

第一个解法:

一般来说,如果您想声明一个已经存在的队列,它必须具有所有正确的参数。所以我正在做的是有一个辅助函数来声明一个特定的队列(我使用的是 c++ 客户端,所以 API 可能不同,但我确信概念是相同的)。例如,如果我有 10 个订阅者正在使用 queue1,并且每个订阅者都需要以相同的方式声明队列,我将简单地编写一个 util 来声明这个队列,仅此而已。


在第二个解决方案之前有一些东西:也许这是我们经常发生的误解的情况:) 您实际上并不需要特定的队列来从该队列获取消息。您需要的是 a 队列和正确的 binding。发送消息时,您并不是真正发送到队列,而是发送到交换器,有时使用路由键,有时不使用 - 假设使用。在接收端,您需要一个队列来使用消息,因此您很自然地声明一个队列,并使用路由键将其绑定到交换器。您甚至不需要显式指定队列名称,服务器会为您提供一个通用名称,以便您在绑定时使用它。


第二种方案: 依赖于

It is perfectly legal to bind multiple queues with the same binding key (found here https://www.rabbitmq.com/tutorials/tutorial-four-java.html)

所以您的每个订阅者都可以按照他们想要的任何方式删除队列,只要他们正确地进行绑定即可。当然,这些将是具有不同名称的不同队列。 我 不推荐 这个。这意味着每条消息都会进入两个队列,并且很可能是一条消息(我假设这里的用例只需要由一个订阅者处理一次)。

基于此处的文档 http://reference.rubybunny.info/Bunny/Queue.htmlhttp://reference.rubybunny.info/Bunny/Channel.html

使用 ch.queues() 方法,您可以获得该通道上所有队列的哈希值。然后,一旦找到要连接的队列实例,就可以使用 q.options() 方法找出该 rabbitmq 队列上的选项。

这似乎是一种迂回的方式,但可能会奏效。我还没有测试这个,因为我现在没有 rabbitmq 服务器。

你试过 queue() 的 :passive=true 参数吗?一个真实的例子是rabbitmq plugin of logstash。 :passive 表示只检查队列是否存在,而不是在使用消息时声明它。