إعادة الاتصال بتجاوز فشل TIBCO EMS لـ C# (TIBCO.EMS.dll)

StackOverflow https://stackoverflow.com/questions/187857

  •  06-07-2019
  •  | 
  •  

سؤال

لدينا حل TIBCO EMS الذي يستخدم تجاوز فشل الخادم المدمج في بيئة خادم 2-4.إذا كانت خدمات إدارة TIBCO لتجاوز الفشل من خادم EMS إلى آخر، فمن المفترض أن يتم نقل الاتصالات إلى الخادم الجديد تلقائيًا على مستوى خدمة EMS.بالنسبة لتطبيقات C# التي تستخدم خدمة EMS، لا يحدث هذا - لا يتم نقل اتصالات المستخدم لدينا إلى الخادم الجديد بعد تجاوز الفشل ولسنا متأكدين من السبب.

اتصال تطبيقنا بـ EMS عند بدء التشغيل فقط، لذا إذا تجاوز فشل مسؤولي TIBCO بعد بدء المستخدمين تطبيقنا، فسيحتاج المستخدمون إلى إعادة تشغيل التطبيق من أجل إعادة الاتصال بالخادم الجديد (يستخدم اتصال EMS الخاص بنا سلسلة خادم بما في ذلك جميع خوادم EMS للإنتاج الأربعة - إذا فشلت المحاولة الأولى، فإنه ينتقل إلى الخادم التالي في السلسلة ويحاول مرة أخرى).

أنا أبحث عن أسلوب تلقائي سيحاول إعادة الاتصال بـ EMS بشكل دوري إذا اكتشف أن الاتصال معطل ولكني لست متأكدًا من أفضل طريقة للقيام بذلك.

أيه أفكار؟نحن نستخدم TIBCO.EMS.dll الإصدار 4.4.2 و.Net 2.x (تطبيق SmartClient)

سيكون موضع تقدير أي مساعدة.

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

المحلول

يجب أن يلخص هذا المنشور تعليقاتي الحالية ويشرح نهجي بمزيد من التفاصيل ...

تعتبر أنواع TIBCO "ConnectionFactory" و"Connection" من الأنواع الثقيلة الوزن والآمنة للخيوط.تقترح TIBCO عليك الاستمرار في استخدام واحد ConnectionFactory (لكل مصنع تم تكوينه بواسطة الخادم) و واحد اتصال لكل مصنع.

الخادم أيضا يبدو ليكون مسؤولاً عن تجاوز فشل "الاتصال" وإعادة الاتصال في مكانه، لذلك دعونا نتأكد من قيامه بعمله ثم الاعتماد على هذه الميزة.

سيكون إنشاء حل من جانب العميل أكثر تعقيدًا قليلاً من إصلاح مشكلة إعداد الخادم أو العميل.يجب إعادة إنشاء جميع الجلسات التي قمت بإنشائها من اتصال فاشل (ناهيك عن المنتجين والمستهلكين والوجهات).لا توجد طرق "إعادة الاتصال" أو "التحديث" في أي من النوعين.لا تحتفظ الجلسات بمرجع إلى اتصالها الأصلي أيضًا.

سيتعين عليك إدارة البحث عن كائنات الاتصال/الجلسة والبدء في إعادة تهيئة الجميع!أو قم بتنفيذ نوع من معالج أحداث فشل الجلسة الذي يمكنه الحصول على الاتصال الجديد وإعادة توصيله.

لذا، في الوقت الحالي، دعونا نتعمق ونرى ما إذا كان العميل قد تم إعداده لتلقي إشعار تجاوز الفشل (دليل مستخدمي tib ems، ص 292).وتأكد من اكتشاف الاستثناء المرفوع، ويحتوي على عنوان URL لتجاوز الفشل، ومن معالجته بشكل صحيح.

نصائح أخرى

أولاً، نعم، أنا أجيب على سؤالي الخاص.من المهم أن نلاحظ، مع ذلك، أنه بدون أجماستريان، لن أكون في أي مكان.شكراً جزيلاً!

واحد:يجب تعيين ConnectionFactory.SetReconnAttemptCount وSetReconnAttemptDelay وSetReconnAttemptTimeout بشكل مناسب.أعتقد أن القيم الافتراضية تعيد المحاولة بسرعة كبيرة جدًا (في حدود 1/2 ثانية بين عمليات إعادة المحاولة).يمكن أن تستغرق خوادم EMS الخاصة بنا وقتًا طويلاً لتجاوز الفشل بسبب مساحة التخزين على الشبكة، وما إلى ذلك - لذا فإن 5 عمليات إعادة المحاولة بفواصل زمنية تبلغ 1/2 ثانية ليست كافية على الإطلاق.

اثنين:أعتقد أنه من المهم تمكين نبضات قلب العميل والخادم والعميل.لم يكن قادرًا على التحقق ولكن بدون تلك العناصر الموجودة، قد لا يتلقى العميل إشعارًا بأن الخادم غير متصل بالإنترنت أو يقوم بالتبديل في وضع تجاوز الفشل.هذا، بالطبع، هو إعداد من جانب الخادم لـ EMS.

ثلاثة:يمكنك مراقبة حدث تجاوز الفشل عن طريق تعيين Tibems.SetExceptionOnFTSwitch(true);ثم قم بتوصيل معالج حدث الاستثناء.عندما تكون في بيئة خادم واحد، ستشاهد رسالة "تم إنهاء الاتصال".ومع ذلك، إذا كنت في بيئة متعددة الخوادم متسامحة مع الأخطاء، فسوف ترى ما يلي:"لقد أجرى الاتصال تبديلًا متسامحًا مع الأخطاء إلى ".لا تحتاج بشدة إلى هذا الإشعار، ولكنه قد يكون مفيدًا (خاصة في الاختبار).

أربعة:من الواضح أن وثائق EMS غير واضحة، ولن تعمل إعادة الاتصال في بيئة خادم واحد.يجب أن تكون في بيئة متعددة الخوادم ومتسامحة مع الأخطاء.ولكن هناك خدعة.يمكنك وضع نفس الخادم في قائمة الاتصال مرتين - أعلم أنه أمر غريب، لكنه يعمل ويمكّن منطق إعادة الاتصال المدمج من العمل.

بعض التعليمات البرمجية:

private void initEMS()
{
    Tibems.SetExceptionOnFTSwitch(true);
    _ConnectionFactory = new TIBCO.EMS.TopicConnectionFactory(<server>);
    _ConnectionFactory.SetReconnAttemptCount(30);       // 30retries
    _ConnectionFactory.SetReconnAttemptDelay(120000);   // 2minutes
    _ConnectionFactory.SetReconnAttemptTimeout(2000);   // 2seconds
_Connection = _ConnectionFactory.CreateTopicConnectionM(<username>, <password>);
    _Connection.ExceptionHandler += new EMSExceptionHandler(_Connection_ExceptionHandler);
}
private void _Connection_ExceptionHandler(object sender, EMSExceptionEventArgs args)
{
    EMSException e = args.Exception;
    // args.Exception = "Connection has been terminated" -- single server failure
    // args.Exception = "Connection has performed fault-tolerant switch to <server url>" -- fault-tolerant multi-server
    MessageBox.Show(e.ToString());
}

قد تتلقى تطبيقات العميل إشعارًا بتجاوز الفشل عن طريق تعيين خاصية النظام tibco.tibjms.ft.switch.exception

ربما تحتاج المكتبة إلى ذلك لتعمل؟

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