0

私はこれを行う方法を理解しようとしています:

一部のプロデューサーは、N 個のキューを作成します (たとえば、foo.1 foo.2 foo.3)。ウサギの別の部分に 1 つのコンシューマーがあり、すべての 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)
4

3 に答える 3

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 []
于 2013-06-12T20:09:03.063 に答える
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)

キューの数がわかっている限り、これを使用できます。

于 2013-06-12T20:06:39.813 に答える
1

RabbitMQ 管理インターフェイス/API は、サーバー上のすべてのキューにアクセスできます。get_queuesを可能にする使いやすい Python クライアントPyRabbitがあります。そこから、必要なフィルタリングを行うことができます。

于 2013-06-12T20:59:53.873 に答える