سؤال

هل هناك أي طريقة للتحقق مما إذا كانت 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.

هتافات

جون كاسريل

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