كيفية التحقق مما إذا كانت MSMQ العامة فارغة
-
02-10-2019 - |
سؤال
هل هناك أي طريقة للتحقق مما إذا كانت MSMQ عامة فارغة؟ بالنسبة إلى MSMQ الخاص ، من السهل:
private bool IsQueueEmpty(string path)
{
bool isQueueEmpty = false;
var myQueue = new MessageQueue(path);
try
{
myQueue.Peek(new TimeSpan(0));
isQueueEmpty = false;
}
catch (MessageQueueException e)
{
if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
isQueueEmpty = true;
}
}
return isQueueEmpty;
}
كيف يمكنني القيام بنفس الفحص ل MSMQ العام؟ إذا حاولت التحقق من MSMQ عام مع الكود أعلاه ، فإنه يعطيني خطأ في الذروة:
System.ArgumentOutOfRangeException: لا يمكن أن يكون الطول أقل من الصفر.
المحلول
ال Peek
الطريقة متاحة فقط على الآلات البعيدة عند استخدام اسم تنسيق مباشر للوصول إلى قائمة الانتظار. يجب أن تكون قادرًا على استخدام نفس الرمز ، طالما أنك لا تعتمد على خدمات الدليل لتوصيلك إلى قائمة الانتظار.
تبدو أسماء قائمة الانتظار المباشرة عمومًا شيئًا مثل: DIRECT=URLAddressSpecification/QueueName
نصائح أخرى
لقد بدأت للتو العمل مع طوابير الرسائل ولكن زميلي في العمل لديه هذه الطريقة الرائعة للتحقق مما إذا كانت قائمة الانتظار فارغة:
if (MessageQueue.Exists(fullQueuePath))
{
// FYI, GetMessageQueue() is a helper method we use to consolidate the code
using (var messageQueue = GetMessageQueue(fullQueuePath))
{
var queueEnum = messageQueue.GetMessageEnumerator2();
if (queueEnum.MoveNext())
{
// Queue not empty
}
else
{
// Queue empty
}
}
}
إن الاستفادة من استخدام هذه الطريقة هي أنه لا يلقي استثناءً ، ولا أعتقد أنه يتطلب منك انتظار حدوث مهلة.
ليو ، أنت متأكد من ذلك؟ لا يمكنك استخدام اسم المسار مع نظرة خاطفة عن بعد؟ لا يقول الخطأ الذي تم إرجاعه اسم التنسيق غير الصحيح ، وهو أمر متوقع إذا كان هذا هو الحال. في الواقع ، يبدو أن الخطأ موجود على خط "isqueueempty = false" - المحاولة/الصيد لا تفرق بين الخطوط المعيبة وخطوط isqueueempty. أراهن أن مكالمة isqueueempty تتلقى استثناءًا يترجم إلى رقم سالب. الآن ، قد يكون الحل الخاص بك صحيحًا - يتطلب الكثير من المكالمات عن بُعد في MSMQ أسماء تنسيق بدلاً من أسماء المسارات. لذلك إذا كنت تستخدم اسمًا تنسيقًا لإنشاء myqueue ، فيجب أن يعمل isqueueempty.
هتافات
جون كاسريل