クライアントからRabbitMQキューサイズを確認する
-
10-07-2019 - |
質問
クライアントアプリケーションからRabbitMQキュー内のメッセージ数を確認する方法があるかどうかは誰にもわかりませんか?
.NETクライアントライブラリを使用しています。
解決
実際には、クライアントを介してこれを取得できます。 queue_declare
操作を実行すると、RabbitMQは(<queue name>, <message count>, <consumer count>)
を含む3つのタプルを返します。 queue_declareのpassive
引数を使用すると、サーバーの状態を変更せずにキューが存在するかどうかを確認できます。したがって、<=>オプションとともに<=>を使用して、キューの長さを確認できます。 .NETについてはわかりませんが、Pythonでは次のようになります。
name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)
他のヒント
私は2年遅すぎましたが、自分で検索していて、rabbitmqがerlangノードと通信するための簡単なスクリプトを提供していることを発見しました.RabbitMQの開始スクリプトが置かれているsbinフォルダー内の..
./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
次の出力が表示されます。
キューのリスト...
QueueName 1
... done。
HTH
.Netクライアントライブラリのバージョン 3.3.1 を使用しています。
以下を使用します。これは、Ralph Willgossの2番目の提案と非常に似ていますが、引数としてキュー名を指定できます。
QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;
更新:mmaloneの非常に役立つ投稿以降、queue_declare(..)のpika実装が変更されたようです。
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)
これがお役に立てば幸いです。簡単に教えてください、私はこの辺りで新しいです:-)
ここに記載されているIModelのMessageCountメソッドを使用できます
編集:これは非常に古い投稿であることは知っていますが、これは最初の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以降、RabbitMQ Management HTTP APIを呼び出すことにより、RabbitMQクライアントライブラリなしでC#プログラムでこれを行うことができます。
// 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管理コンソールUIへのログインに使用するものと同じです。
レスポンスは、他のプロパティの中でも特に、メッセージカウントを含むキューのリストを含むJSON文字列になります。 (必要に応じて、 Json.NET などのライブラリを使用して、そのJSONをC#オブジェクトにデシリアライズできます。 )
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アドレスは単なる例です。