Pergunta sobre .net, amqp, message-queue, rabbitmq – Verifique o tamanho da fila RabbitMQ do cliente

41

Alguém sabe se há uma maneira de verificar o número de mensagens em uma fila RabbitMQ de um aplicativo cliente?

Estou usando a biblioteca cliente .NET.

Sua resposta

8   a resposta
2

Pelo menos a partir do RabbitMQ 3.3.5, você pode fazer isso em um programa C # sem qualquer biblioteca cliente RabbitMQ chamando a API HTTP de Gerenciamento do RabbitMQ:

<code>// 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);
</code>

O nome de usuário e a senha são os mesmos que você usa para efetuar login na interface do usuário do console de gerenciamento RabbitMQ.

A resposta será uma string JSON com a lista de filas, incluindo suas contagens de mensagens, entre outras propriedades. (Se quiser, você pode desserializar esse JSON em um objeto C # usando uma biblioteca comoJson.NET.)

A documentação da API é instalada junto com o console de gerenciamento RabbitMQ e deve estar disponível nesse servidor emhttp: // MY_RABBITMQ_SERVER: 15672 / api .

10

Eu estou 2 anos atrasado, mas eu estava procurando por mim mesmo e descobri que o rabbitmq fornece um script simples para se comunicar com erlang nodes..its na pasta sbin onde o script inicial do RabbitMQ está localizado ... para que você possa basicamente dizer

<code>./rabbitmqctl list_queues
</code>

Isto irá mostrar as filas, juntamente com a contagem de mensagens pendentes para as filas da mesma forma que você também pode dizer

<code>./rabbitmqctl list_channels
./rabbitmqctl list_connections
</code>

etc Para mais informações você pode visitarAqui

9

Se você quisesse fazer isso no .Net, verifique qual versão da biblioteca Cliente que você está usando.

Estou usando o2.2.0 versão e eu tive que usar BasicGet (queue, noAck).
Nesta versão da Biblioteca QueueDeclare () somente retorna uma string contendo o nome da fila.

<code>BasicGetResult result = channel.BasicGet("QueueName", false);
uint count = result != null ? result.MessageCount : 0;
</code>


Eu sei do2.6.1 versão, QueueDeclare () retorna um objeto do tipo QueueDeclareOk.

<code>QueueDeclareOk result = channel.QueueDeclare();
uint count = result.MessageCount;
</code>


Alternativamente, você pode chamar a partir da linha de comando:

<code><InstallPathToRabbitMq>\sbin\rabbitmqctl.bat list_queues
</code>

E você vê a seguinte saída:

Listando filas ...
Nome da fila 1
...feito.

HTH

4

Você pode usar o método MessageCount do IModel, documentado aqui

http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v3.6.4/rabbitmq-dotnet-client-3.6.4-client-htmldoc/html/type-RabbitMQ.Client.IModel.html#method- M: RabbitMQ.Client.IModel.MessageCount (System.String)

edit: Eu sei que este é um post muito antigo, mas é a primeira resposta do google, e espero que ajude as pessoas que estão procurando por essa resposta no futuro.

Esta é a primeira vez que vi isso mencionado. Por que é que?!! Theyouthis
9

Estou usando a versão3.3.1 da Biblioteca do Cliente .Net.

Eu uso o seguinte, que é muito semelhante à segunda sugestão de Ralph Willgoss, mas você pode fornecer o nome da fila como um argumento.

<code>QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
</code>
5

Atualização: parece que a implementação do pika de queue_declare (..) mudou desde o post muito útil do mmalone.

Em python / pika (v0.9.5) ainda é possível verificar a profundidade da fila via pika, mas isso requer uma abordagem um pouco mais indireta.

queue_declare (...) passa um objeto de método para sua função de retorno de chamada, que você pode inspecionar. Por exemplo, para verificar o número de mensagens e consumidores na fila denominada'myQueue':

<code>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)
</code>

Espero que isso ajude, e por favor, vá fácil comigo, eu sou novo por aqui :-)

channel.queue_declare retorna um objeto que contém a contagem de mensagens atual, portanto, se você quiser evitar um retorno de chamada, também poderá acessar a contagem de mensagens da seguinte forma: myChannel.method.message_count corford
65

Você pode recuperar isso através do cliente. Quando executar umqueue_declare operação RabbitMQ retorna três tuplas contendo(<queue name>, <message count>, <consumer count>). opassive O argumento para queue_declare permite verificar se existe uma fila sem modificar o estado do servidor. Então você pode usarqueue_declare com opassive opção para verificar o comprimento da fila. Não tenho certeza sobre o .NET, mas em Python é algo como isto:

<code>name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
</code>
Esta não é mais a melhor maneira de fazer isso. Theyouthis
@Theyouthis É muito frustrante encontrar comentários como "Esta não é mais a melhor maneira de fazê-lo", sem qualquer tipo de referência à maneira melhorada a qual você está se referindo. Por que não compartilhar suas descobertas? spender
Esta deve ser a resposta aceita, mesmo que ele tenha perdido o Basic. Obtenha como a segunda fonte dessa informação. Michael Dillon
O que é chan aqui e como importá-lo? Kishan
Use a função MessageCount () no seu IModel. Se você rolar para baixo, verá duas respostas mencionando a função nesta mesma pergunta. Theyouthis
5

meu pequeno trecho baseado na resposta do Myydrralls. Eu acho que se ele tivesse código em sua resposta eu poderia ter notado isso muito mais rápido.

<code>public uint GetMessageCount(string queueName)
{
    using (IConnection connection = factory.CreateConnection())
    using (IModel channel = connection.CreateModel())
    {
        return channel.MessageCount(queueName);
    }
}
</code>

Perguntas relacionadas