Проверьте размер очереди RabbitMQ у клиента
-
10-07-2019 - |
Вопрос
Кто-нибудь знает, есть ли способ проверить количество сообщений в очереди RabbitMQ из клиентского приложения?
Я использую клиентскую библиотеку .NET.
Решение
Вы действительно можете получить это через клиента. При выполнении операции queue_declare
RabbitMQ возвращает три кортежа, содержащие (<queue name>, <message count>, <consumer count>)
. Аргумент passive
для queue_declare позволяет вам проверить, существует ли очередь без изменения состояния сервера. Таким образом, вы можете использовать <=> с параметром <=> для проверки длины очереди. Не уверен насчет .NET, но в Python это выглядит примерно так:
name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
Другие советы
Я опоздал на 2 года, но я искал его сам и обнаружил, что rabbitmq предоставляет простой скрипт для связи с узлами erlang .. он находится в папке sbin, где находится стартовый скрипт для RabbitMQ located..so в принципе, вы можете сказать
./rabbitmqctl list_queues
при этом будут отображены очереди вместе с количеством сообщений, ожидающих отправки в эти очереди аналогичным образом вы также можете сказать
./rabbitmqctl list_channels
./rabbitmqctl list_connections
и т.д.Для получения дополнительной информации вы можете посетить здесь
Если вы хотели сделать это в .Net, проверьте, какую версию клиентской библиотеки вы используете.
Я использую 2.2.0 версия, и мне пришлось использовать BasicGet (queue, noAck).
В этой версии библиотеки QueueDeclare() возвращает только строку, содержащую имя очереди.
BasicGetResult result = channel.BasicGet("QueueName", false);
uint count = result != null ? result.MessageCount : 0;
Я знаю из 2.6.1 версия, QueueDeclare() возвращает объект типа QueueDeclareOk.
QueueDeclareOk result = channel.QueueDeclare();
uint count = result.MessageCount;
В качестве альтернативы вы можете вызвать из командной строки:
<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues
И вы видите следующий результат:
Список очередей...
Имя очереди 1
...сделано.
HTH
Я использую версию 3.3.1 .Net Client Library.
Я использую следующее, которое очень похоже на второе предложение Ральфа Уилгосса, но вы можете указать имя очереди в качестве аргумента. Р>
QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
Обновление: похоже, что реализация queue_declare (..) в pika изменилась с момента очень полезной публикации mmalone.
В python / pika (v0.9.5) все еще возможно проверить глубину очереди с помощью pika, но это требует немного более косвенного подхода. Р>
queue_declare (...) передает объект метода в функцию обратного вызова, которую вы затем можете проверить. Например, чтобы проверить количество сообщений и потребителей в очереди с именем 'myQueue'
:
def cbInspect(qb):
messagesInQueue = qb.method.message_count
print "There are %d messages in myQueue" % messagesInQueue
consumersInQueue = qb.method.consumer_count
print "There are %d consumers in myQueue" % consumersInQueue
return
myChannel = channel.queue_declare(callback=cbInspect, queue='myQueue', passive=True)
Надеюсь, это поможет, и, пожалуйста, будьте осторожны, я новичок здесь: -)
Вы можете использовать метод MessageCount IModel, описанный здесь
edit: я знаю, что это очень старый пост, но это первый ответ от Google, и я надеюсь, что он поможет людям в будущем найти этот ответ.
мой маленький фрагмент, основанный на ответе Myydrralls. Я думаю, что если бы в его ответе был код, я бы заметил это гораздо быстрее.
public uint GetMessageCount(string queueName)
{
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
return channel.MessageCount(queueName);
}
}
По крайней мере, начиная с версии RabbitMQ 3.3.5, вы можете сделать это в программе на C # без какой-либо клиентской библиотеки RabbitMQ, вызвав HTTP API управления RabbitMQ:
// The last segment of the URL is the RabbitMQ "virtual host name".
// The default virtual host name is "/", represented urlEncoded by "%2F".
string queuesUrl = "http://MY_RABBITMQ_SERVER:15672/api/queues/%2F";
WebClient webClient = new WebClient { Credentials = new NetworkCredential("MY_RABBITMQ_USERNAME", "MY_RABBITMQ_PASSWORD") };
string response = webClient.DownloadString(queuesUrl);
Имя пользователя и пароль совпадают с теми, которые вы используете для входа в пользовательский интерфейс консоли управления RabbitMQ.
Ответом будет строка JSON со списком очередей, включая количество их сообщений, среди прочих свойств.(Если хотите, вы можете десериализовать этот JSON в объект C #, используя библиотеку типа Json.NET.)
Документация API устанавливается вместе с консолью управления RabbitMQ и должна быть доступна на этом сервере по адресу http://MY_RABBITMQ_SERVER:15672/api .
Мне удалось получить размер / глубину очереди из программы на Python. 1. используя py_rabbit
from pyrabbit.api import Client
cl = Client('10.111.123.54:15672', 'userid', 'password',5)
depth = cl.get_queue_depth('vhost', 'queue_name')
- kombu [пакет python обычно поставляется с установкой из сельдерея] Ол>
conn = kombu.Connection('amqp://userid:password@10.111.123.54:5672/vhost')
conn.connect()
client = conn.get_manager()
queues = client.get_queues('vhost')
for queue in queues:
if queue == queue_name:
print("tasks waiting in queue:"+str(queue.get("messages_ready")))
print("tasks currently running:"+str(queue.get("messages_unacknowledged")))
IP-адрес является лишь примером. Р>