Verifique o tamanho do RabbitMQ fila do cliente
-
10-07-2019 - |
Pergunta
Alguém sabe se existe uma maneira de verificar o número de mensagens em uma fila RabbitMQ de um aplicativo cliente?
Eu estou usando a biblioteca cliente .NET.
Solução
Você realmente pode recuperar esta via o cliente. Quando executar uma operação RabbitMQ queue_declare
retorna uma contendo três (<queue name>, <message count>, <consumer count>)
tuplo. O argumento passive
para queue_declare permite verificar se uma fila existente, sem modificar o estado do servidor. Assim você pode usar queue_declare
com a opção passive
para verificar fila de comprimento. Não tenho certeza NET, mas em Python que é algo como isto:
name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
Outras dicas
Eu sou 2 anos de atraso, mas eu estava procurando por ele próprio e descobriu que RabbitMQ dá u script simples para se comunicar com erlang nodes..its em sbin pasta onde o script de partida para RabbitMQ é located..so você pode basicamente dizer
./rabbitmqctl list_queues
isso irá exibir as filas junto com a contagem de mensagens pendentes para essas filas Da mesma forma você também pode dizer
./rabbitmqctl list_channels
./rabbitmqctl list_connections
etc. Para mais informações você pode visitar aqui
Se você quiser fazer isso em .Net, verificar qual versão da biblioteca de cliente que você está usando.
Eu estou usando o 2.2.0 versão e eu tive que usar BasicGet (fila, Noack).
Nesta versão da Biblioteca QueueDeclare () retorna apenas uma string contendo o nome da fila.
BasicGetResult result = channel.BasicGet("QueueName", false);
uint count = result != null ? result.MessageCount : 0;
Eu sei do 2.6.1 versão, QueueDeclare () retorna um objeto do tipo QueueDeclareOk.
QueueDeclareOk result = channel.QueueDeclare();
uint count = result.MessageCount;
Alternativamente, você pode chamar a partir da linha de comando:
<InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues
E você vê o seguinte resultado:
A Lista filas ...
QueueName 1 | ... feito.
HTH
Eu estou usando a versão 3.3.1 da Biblioteca cliente .NET.
Eu uso o seguinte, que é muito semelhante ao Ralph Willgoss segunda sugestão, mas você pode fornecer o nome da fila como um argumento.
QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
Update:. Parece que a implementação pika de queue_declare (..) mudou desde mmalone é pós muito útil
Em python / pika (v0.9.5) ainda é possível verificar a profundidade da fila via pika, mas requer uma abordagem um pouco mais indireta.
queue_declare (...) passa um objeto método em sua função de retorno de chamada, que você pode então inspecionar. Por exemplo, para verificar o número de mensagens e consumidores na fila 'myQueue'
chamado:
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)
Espero que isso ajude, e por favor, vá fácil em mim, eu sou novo por aqui: -)
Você pode usar o método MessageCount do IModel, documentado aqui
edit:. Eu sei que este é um post muito antiga, mas é a primeira resposta do Google, e eu espero que isso vai ajudar as pessoas que procuram esta resposta no futuro
meu pequeno trecho com base na resposta Myydrralls'. Eu acho que se ele tivesse código em sua resposta que eu poderia ter notado que muito mais rápido.
public uint GetMessageCount(string queueName)
{
using (IConnection connection = factory.CreateConnection())
using (IModel channel = connection.CreateModel())
{
return channel.MessageCount(queueName);
}
}
Pelo menos a partir de RabbitMQ 3.3.5, você pode fazer isso em um programa C # sem qualquer biblioteca cliente RabbitMQ chamando a API de gerenciamento RabbitMQ HTTP:
// 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);
O nome de usuário ea senha são os mesmos que você usa para entrar no interface do usuário do console de gerenciamento RabbitMQ.
Response será uma string JSON com a lista de filas, incluindo a sua contagem de mensagens, entre outras propriedades. (Se quiser, você pode desserializar que JSON em um objeto C # usando uma biblioteca como Json.NET . )
A documentação da API é instalado junto com o console de gerenciamento RabbitMQ e deve estar disponível no servidor em http: // MY_RABBITMQ_SERVER: 15672 / api .
Eu era capaz de obter o tamanho / profundidade de fila de programa de python. 1. usando 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 [um pacote de python geralmente vem com a instalação de aipo]
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")))
O endereço IP é apenas um exemplo.