首页 > 解决方案 > Ruby Bunny - 从多个队列中消费

问题描述

我刚刚开始使用 Ruby,正在写一篇文章来使用 RabbitMQ 队列中的一些消息。我正在使用兔子这样做。

所以我创建了我的队列并将它们绑定到一个交换。

但是我现在不确定如何处理订阅它们并允许 ruby​​ 应用程序继续运行(希望消息继续通过,即不被阻止或至少不会很长时间),直到我实际使用 ctrl+c 退出它.

但是我尝试过使用:block => true,因为我订阅了 2 个不同的队列,使用这意味着它仍然只消耗一个。

所以这就是我使用消息的方式:

def consumer

    begin
      puts ' [*] Waiting for messages. To exit press CTRL+C'

      @oneQueue.subscribe(:manual_ack => true) do |delivery_info, properties, payload|
        puts('Got One Queue')
        puts "Received #{payload}, message properties are #{properties.inspect}"
      end

      @twoQueue.subscribe(:manual_ack => true) do |delivery_info, properties, payload|
        puts('Got Two Queue')
        puts "Received #{payload}, message properties are #{properties.inspect}"
      end

    rescue Interrupt => _
      #TODO - close connections here

      exit(0)
    end

end

任何帮助,将不胜感激。

谢谢!

标签: rubyrabbitmqbunny

解决方案


当您有两个订阅时,您不能使用block: true,因为只有第一个会被阻止;它永远不会进入第二次订阅。

您可以做的一件事是在不阻塞的情况下设置两个订阅(这将自动生成两个线程来处理消息),然后使用等待循环阻塞您的主线程(在您的之前添加rescue):

loop { sleep 5 }

推荐阅读