سؤال

لدينا مستمع Java يقرأ الرسائل النصية خارج قائمة الانتظار في JBossMQ.إذا كان علينا إعادة تشغيل JBoss، فلن يقوم المستمع بإعادة الاتصال وبدء قراءة الرسائل مرة أخرى.نتلقى فقط رسائل في ملف سجل المستمع كل دقيقتين تفيد بأنه لا يمكنه الاتصال.هل هناك شيء لم نقم بإعداده في الكود الخاص بنا أو في JBossMQ؟أنا جديد في JMS لذا فإن أي مساعدة ستكون محل تقدير كبير.شكرًا.

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

المحلول

يجب عليك التنفيذ في رمز العميل الخاص بك javax.jms.ExceptionListener.سوف تحتاج إلى طريقة تسمى onException.عند فقدان اتصال العميل، يجب أن تحصل على JMSException، وسيتم استدعاء هذه الطريقة تلقائيًا.الشيء الوحيد الذي يجب عليك البحث عنه هو ما إذا كنت تقوم بقطع الاتصال عن JBossMQ عمدًا - فسيؤدي ذلك أيضًا إلى حدوث استثناء.

قد تبدو بعض التعليمات البرمجية كما يلي:

    public void onException (JMSException jsme)
    {
        if (!closeRequested)
        {
            this.disconnect();
            this.establishConnection(connectionProps, queueName, uname, pword, clientID, messageSelector);
        }        
        else
        {
            //Client requested close so do not try to reconnect
        }
    }

في رمز "إنشاءConnection" الخاص بك، ستقوم بعد ذلك بتنفيذ ملف while(!initialized) بناء يحتوي على محاولة/التقاط بداخله.حتى تتأكد من الاتصال والاشتراك بشكل صحيح، ابق داخل الحلقة أثناء التقاط جميع JMS/Naming/إلخ.استثناءات.

لقد استخدمنا هذه الطريقة لسنوات مع JBossMQ وهي تعمل بشكل رائع.لم نواجه أبدًا مشكلة مع عملاء JMS الذين لا يعيدون الاتصال بعد ارتداد JBossMQ أو فقدان اتصال الشبكة.

نصائح أخرى

أنصحك بشدة باستخدام تجريدات الربيع لـ JMS مثل messageListenerContainer للتعامل مع إعادة الاتصال والمعاملات والتجميع نيابة عنك.كل ما تحتاجه هو توفيرMessageListener وتكوينMessageListenerContainer مع ConnectionFactory والحاوية تقوم بالباقي.

إذا كنت مستمعا بحتة وتفعل لا مكالمات JMS أخرى بخلاف إعداد الاتصال، فإن إجابة "معالج onException()" صحيحة.

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

لذلك، إذا قمت باستدعاء أي من أساليب JMS من التعليمات البرمجية الخاصة بك، فستحتاج أيضًا إلى استدعاء منطق إعادة الاتصال هذا إذا حصلت على أي استثناءات لهذه الاستدعاءات.

نصيحة من تجربة شخصية. ترقية الى الرسائل جي بوس. لقد رأيته في الإنتاج لمدة 4 أشهر دون مشاكل.يتميز بتجاوز الفشل بشكل شفاف تمامًا - من بين العديد من الميزات الأخرى.

أيضًا، إذا ذهبت مع الربيع، كن كذلك جداً حذر مع ال JmsTemplate.

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