6

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

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

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

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

它给我一个错误,说明不同的耐用属性。默认情况下,兔子似乎使用耐用 = 假。所以我添加了耐用的真实作为参数。现在它说明了其他参数之间的差异。我是否需要指定所有参数才能连接到它?由于rabbitMQ由不同的环境维护,我很难获得所有属性。

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

4

3 回答 3

2

您是否尝试过 queue() 上的 :passive=true 参数?一个真实的例子是 logstash 的rabbitmq 插件。:passive 意味着只检查队列的存在而不是在消费消息时声明它。

于 2016-02-26T02:35:31.450 回答
1

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

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

似乎是一个回合的方法,但可能会奏效。我没有对此进行测试,因为我目前没有 rabbitmq 服务器。

于 2016-02-25T22:57:28.280 回答
0

也许有办法用 rabbitmqctl 或管理工具(我忘记了名字),所以关于队列的信息。即使是这样,我也不会打扰。

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

第一个解决方案:

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


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


第二种解决方案: 依赖于以下事实

使用相同的绑定键绑定多个队列是完全合法的(在此处找到https://www.rabbitmq.com/tutorials/tutorial-four-java.html

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

于 2016-02-23T23:04:31.107 回答