获取队列而不提供其所有属性

时间:2016-02-16 10:33:38

标签: ruby queue rabbitmq message-queue bunny

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

看起来像是一个关于如何做到但可能有效的方法。我还没有对此进行过测试,因为我目前还没有设备上的兔子服务器。

答案 2 :(得分:0)

也许有办法用rabbitmqctl或管理工具(我忘记了名字)来获取它,所以有关队列的信息。即便如此,我也不会打扰。

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

第一个解决方案:

通常,如果要声明已存在的队列,则必须使用所有正确的参数。所以我正在做的是有一个帮助函数来声明一个特定的队列(我使用c ++客户端,所以API可能不同,但我确定概念是一样的)。例如,如果我有10个订阅者正在使用queue1,并且每个订阅者都需要以相同的方式声明队列,那么我将简单地编写一个声明此队列的工具,以及那个。

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

第二个解决方案: 依赖于

的事实
  

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

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