我正在努力了解如何执行此操作:
一些生产者创建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)
答案 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。从那里你可以做任何你需要的过滤。