Получить размер очереди в Pika (AMQP Python) - PullRequest
25 голосов
/ 19 ноября 2011

Простой вопрос, но Google или открытый исходный код Pika не помогли. Есть ли способ запросить текущий размер очереди (счетчик элементов) в Pika?

Ответы [ 4 ]

33 голосов
/ 29 ноября 2012

Я знаю, что этот вопрос немного устарел, но вот пример того, как сделать это с помощью pika.

Что касается AMQP и RabbitMQ, если вы уже объявили очередь, вы можете повторно объявить очередьс пассивным флагом и сохранением всех остальных параметров очереди одинаковыми.Ответ на это объявление Declare-OK будет включать в себя количество сообщений в очереди.

Вот пример с Пика 0.9.5:

import pika

def on_callback(msg):
    print msg

params = pika.ConnectionParameters(
        host='localhost',
        port=5672,
        credentials=pika.credentials.PlainCredentials('guest', 'guest'),
    )

# Open a connection to RabbitMQ on localhost using all default parameters
connection = pika.BlockingConnection(parameters=params)

# Open the channel
channel = connection.channel()

# Declare the queue
channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False
    )

# ...

# Re-declare the queue with passive flag
res = channel.queue_declare(
        callback=on_callback,
        queue="test",
        durable=True,
        exclusive=False,
        auto_delete=False,
        passive=True
    )
print 'Messages in queue %d' % res.method.message_count

Этовыведет следующее:

<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
<Method(['frame_type=1', 'channel_number=1', "method=<Queue.DeclareOk(['queue=test', 'message_count=0', 'consumer_count=0'])>"])>
Messages in queue 0

Количество сообщений от участника message_count.

11 голосов
/ 30 июля 2014

Вот как вы можете получить длину очереди, используя pika (учитывая, что вы используете по умолчанию имя пользователя и пароль на локальном хосте), замените q_name на имя вашей очереди.

import pika
connection = pika.BlockingConnection()
channel = connection.channel()
q = channel.queue_declare(q_name)
q_len = q.method.message_count
6 голосов
/ 19 ноября 2011

Вы пробовали PyRabbit ?Он имеет get_queue_depth() метод , который звучит как то, что вы ищете.

4 голосов
/ 19 ноября 2011

Есть два способа получить размер очереди в протоколе AMQP.Вы можете использовать Queue.Declare или Basic.Get.

Если вы используете сообщения по мере их поступления с использованием Basic.Consume, вы не сможете получить эту информацию, если не отключите (тайм-аут) и не повторно объявите очередь, или не получите одно сообщение, но не подтвердите его.В более новых версиях AMQP вы можете активно запрашивать сообщение.

Что касается Pika, я не знаю специфики, но клиенты Python для AMQP были занудой на моей стороне.Зачастую вам необходимо создать monkeypatch классы, чтобы получить необходимую вам информацию, или позволить потребителю очереди установить тайм-аут, чтобы вы могли делать другие вещи через определенные промежутки времени, такие как запись статистики или узнать, сколько сообщений в очереди.

Другой способ обойти это - сдаться и использовать класс Pipe для запуска sudo rabbitmqctl list_queues -p my_vhost.Затем проанализируйте вывод, чтобы найти размер всех очередей.Если вы сделаете это, вам нужно будет настроить /etc/sudoers, чтобы он не запрашивал обычный пароль sudo.

Я молюсь, чтобы кто-то еще с большим опытом Pika ответил на это, указав, как вы можете делать все то, что яупомянуто, в этом случае я буду загружать Пику и пнуть шины.Но если этого не произойдет, и у вас возникнут проблемы с извлечением кода Pika, то посмотрите на haigha.Я обнаружил, что их код намного проще, чем другие клиентские библиотеки Python AMQP, потому что они ближе к протоколу AMQP.

...