نظرة على قائمة انتظار صادرة من MSMQ مع JScript
سؤال
لقد قمت بإنشاء برنامج نصي لمراقبة مجموعة من قوائم الانتظار ، وعلى الرغم من أنه يعمل بشكل مثالي مع قوائم الانتظار عن بُعد ، إلا أنه لا يعمل مع قوائم الانتظار الصادرة. لقد قمت بتجربة عن طريق إزالة كل شيء ما عدا النصي من البرنامج النصي ، وقمت بإنشاء البرنامج النصي الاختبار التالي:
var info = new ActiveXObject("MSMQ.MSMQQueueInfo");
info.FormatName = /*<Queue name>*/;
// 0x80 = MQ_ADMIN_ACCESS
// 0x20 = MQ_PEEK_ACCESS
// 0x00 = MQ_DENY NONE
var mq = info.Open(0x80 | 0x20, 0x00);
var msg = mq.PeekCurrent(false, true, 0);
if (msg != null) {
WScript.echo("message found");
}
else
{
WScript.echo("Nothing");
}
mq.close();
ثم قمت بتشغيله على الخادم ، وحتى إذا كانت قائمة الانتظار تحتوي على أكثر من ألف رسالة ، نظرة خاطفة يعود دائما لاغية. إذا قمت بإزالة MQ_ADMIN_ACCESS ، فإنه يحاول الاتصال بقائمة الانتظار الخاصة عن بُعد وأمر في الخارج (كما هو متوقع ، كما هو الحال في السماح للرسائل بالتراكم). إذا قمت بعد ذلك ببدء قائمة الانتظار الخاصة عن بُعد ، فإنها تقرأ الرسالة بشكل صحيح منها.
بدافع الفضول ، اكتشفت ذلك info.Open ينجح دائمًا بغض النظر عن اسم قائمة الانتظار (أي ما إذا كان موجودًا أم لا) عند استخدام MQ_ADMIN_ACCESS. على سبيل المثال ، كتبت "Direct = OS: مهما كان $ randomqueuename" ، ولم أحصل على أي خطأ.
أنا لست خبيرًا في MSMQ (عكس ذلك تمامًا) ، لذلك ربما أرتكب خطأً واضحًا ولا يمكنني رؤيته. أي مساعدة أكثر من موضع ترحيب. شكرًا.
سؤال جانبي: هل من الممكن إلقاء نظرة على قائمة انتظار صادرة عن بُعد؟ في الوقت الحالي ، يعمل البرنامج النصي على الجهاز حيث يوجد قائمة الانتظار الصادرة التي أختبرها ، لكنها ليست الوحيدة التي تحتوي على قوائم الانتظار هذه. أود تجنب نشر البرنامج النصي في كل مكان ، أفضل الحصول عليه في مكان واحد. شكرًا.
المحلول
لقد وجدت الإجابات على كلا أسئلتي:
كانت المشكلة التي كنت أواجهها بسبب حقيقة أنني حاولت مراقبة قائمة انتظار MSMQ التي تم تشغيلها كجزء من مجموعة موارد الكتلة ، بينما كان البرنامج النصي يعمل ضمن جلسة وحدة التحكم الحالية. للوصول إلى قائمة انتظار داخل مجموعة موارد الكتلة ، يجب القيام بما يلي:
- إنشاء تطبيق عام جديد
- مورد داخل المجموعة حيث تعمل خدمة MSMQ ، وتوجهها إلى البرنامج النصي الخاص بك.
- في تكوين المورد الجديد ، أضف خدمة MSMQ كاعتماد.
- تأكد من أن مربع الاختيار "استخدام اسم الشبكة كاسم كمبيوتر" التحقق.
تم القيام به ، سيقوم البرنامج النصي الخاص بك الآن بالاتصال بخدمة MSMQ التي تعمل داخل مجموعة الكتلة.
- قوائم الانتظار الصادرة ليست طوابير حقيقية ، ولكن يمكن اعتبارها "قائمة بالرسائل ، التي تم تجميعها بواسطة قائمة الانتظار التي يتواجدون عليها". لذلك ، لا يمكن مراقبتها عن بُعد. هذا يعني أنه ، لمراقبتها ، البرنامج النصي/التطبيق الذي يجب نشره على كل جهاز ، وفي بيئة مجمعة ، يجب تشغيل مثيل في كل مجموعة مجموعة. هذا يضيف حمولة كبيرة إذا كان هناك العديد من الخوادم ، ولكن يمكن التغلب عليها من خلال إنشاء نظام مركزي. مهمة كبيرة على أي حال ...
آمل أن تكون النتائج التي توصلت إليها مفيدة لشخص ما في المستقبل. :) عد إلى بيتزا خبز ...