如何订阅消费者N个未知队列?

时间:2013-06-12 19:10:10

标签: python queue rabbitmq amqp pika

我正在努力了解如何执行此操作:

一些生产者创建N个队列(假设为foo.1 foo.2 foo.3)。我在Rabbit的另一部分上有一个消费者需要从所有N(在我的例子3中)队列中获取消息。我知道我可以这样做:

(method_frame, header_frame, body) = self.channel.basic_get(queue='foo.1', no_ack=False)
(method_frame, header_frame, body) = self.channel.basic_get(queue='foo.2', no_ack=False)
(method_frame, header_frame, body) = self.channel.basic_get(queue='foo.3', no_ack=False)

但是,如果我的消费者不知道名字,我真正想做的是:

(method_frame, header_frame, body) = self.channel.basic_get(queue='foo.*', no_ack=False)

3 个答案:

答案 0 :(得分:1)

这是我看到的: 您需要从提供的n个队列中获取所有消息。根据我的个人经验,我只想写一个for循环并通过添加"foo.%s" % (iteration)创建一个字符串。

这是我的意思的一个例子:

for i in range(queues):
    str = 'foo.%s' % (i)
    (method_frame, header_frame, body) = self.channel.basic_get(queue=str, no_ack=False)

只要你知道队列的数量,就可以使用它。

答案 1 :(得分:1)

如果您的消费者有办法识别队列,您应该可以通过foo.__dict__搜索来找到所有队列。

您应该记住,如果您的任何队列都是在班级设置的,那么它们就不会出现在foo.__dict__中。在这种情况下,您将必须编写一个遍历foo的mro的算法。

或者,如果您可以修改队列的创建,则可以通过使用某种管理器来跟踪它们。

class MyQueue(list):
    queues = {}  # Keeps track of all the queues out there

    @classmethod
    def add_to_producer(cls, obj, name, init_values):
        q = MyQueue(init_values)
        cls.queues[(obj, name)] = q
        setattr(obj, name, q)


class MyProducer(object):

    def __init__(self):
        # Initialize our producer with a couple of queues
        MyQueue.add_to_producer(self, 'a', [1,2])
        MyQueue.add_to_producer(self, 'b', [])


p1 = MyProducer()
p2 = MyProducer()
# Add another queue to p2
MyQueue.add_to_producer(p2, 'c', [4,5,6])

# Go through all of our created queues
for obj, attr_name in MyQueue.queues:
    if obj == p1:
        print 'p1', getattr(obj, attr_name)

    if obj == p2:
        print 'p2', getattr(obj, attr_name)

>>> p1 [1, 2]
>>> p1 []
>>> p2 [4, 5, 6]
>>> p2 [1, 2]
>>> p2 []

答案 2 :(得分:1)

RabbitMQ管理界面/ api将可以访问服务器上的所有队列。有一个易于使用的Python客户端PyRabbit,可以让你get_queues。从那里你可以做任何你需要的过滤。