سؤال

هل يعرف أحد ما إذا كانت هناك طريقة للتحقق من عدد الرسائل في قائمة انتظار RabbitMQ من تطبيق العميل؟

أنا أستخدم مكتبة عملاء .NET.

هل كانت مفيدة؟

المحلول

وكنت في الواقع يمكن استرداد هذا عن طريق العميل. عندما إجراء عملية queue_declare RabbitMQ إرجاع ثلاثة الصفوف (tuple) التي تحتوي على (<queue name>, <message count>, <consumer count>). حجة passive إلى queue_declare يسمح لك للتحقق ما إذا طابور موجود دون تعديل حالة الملقم. بحيث يمكنك استخدام queue_declare مع خيار passive للتحقق طول انتظار. غير متأكدة من .NET، ولكن في بيثون يبدو شيئا من هذا القبيل:

name, jobs, consumers = chan.queue_declare(queue=queuename, passive=True)

نصائح أخرى

وأنا 2 سنوات في وقت متأخر جدا ولكن كنت تبحث عن ذلك بنفسي ووجدت أن rabbitmq يعطي ش سيناريو بسيط للتواصل مع nodes..its إرلانج في مجلد 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
...منتهي.

هث

أنا أستخدم الإصدار 3.3.1 من مكتبة عميل Net.

أستخدم ما يلي، وهو مشابه جدًا لاقتراح Ralph Willgoss الثاني ولكن يمكنك توفير اسم قائمة الانتظار كوسيطة.

QueueDeclareOk result = channel.QueueDeclarePassive(queueName);
uint count = result != null ? result.MessageCount : 0;

تحديث: يبدو أن تنفيذ بيكا من queue_declare (..) لم يتغير منذ mmalone ما بعد مفيدة جدا

في بيثون / بيكا (v0.9.5) أنه لا يزال من الممكن للتحقق من عمق طابور عبر بيكا، ولكن هذا الامر يتطلب مقاربة أكثر قليلا غير مباشر.

و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 وموثقة هنا

<وأ href = "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 # طريقة M: RabbitMQ.Client.IModel.MessageCount (System.String) "يختلط =" noreferrer "> 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)

وتحرير: أعرف أن هذا هو وظيفة قديمة جدا، ولكن هذا هو استجابة جوجل الأولى، وآمل أن تساعد الناس الذين يبحثون عن هذه الإجابة في المستقبل

وبلدي مقتطف صغير على أساس الإجابة 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 عن طريق استدعاء API إدارة 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);

واسم المستخدم وكلمة المرور هي نفسها التي تستخدمها لتسجيل الدخول إلى واجهة المستخدم وحدة إدارة RabbitMQ.

والاستجابة ستكون سلسلة JSON مع قائمة من قوائم الانتظار، بما في ذلك بحساب رسالتهم، من بين غيرها من الممتلكات. (إذا أردت، يمكنك إلغاء تسلسل أن JSON إلى C # كائن باستخدام مكتبة مثل Json.NET . )

ويتم تثبيت الوثائق API جنبا إلى جنب مع وحدة تحكم إدارة RabbitMQ ويجب أن تكون متاحة على ذلك الملقم في HTTP: // MY_RABBITMQ_SERVER: 15672 / المعهد .

تمكنت من الحصول على حجم/عمق قائمة الانتظار من برنامج بايثون.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')
  1. kombu [حزمة بايثون تأتي عادةً مع تثبيت الكرفس]
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 هو مجرد مثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top