سؤال

وأنا أحاول أن تنفيذ اختبار الأداء على ActiveMQ، بحيث يكون الإعداد منتج الأساسية والاستهلاكية لإرسال واستقبال الرسائل عبر طابور. لقد خلق منتج دون أي مشاكل، والحصول على لكتابة عدد معين من الرسائل إلى قائمة الانتظار:

 for(int i = 0; i < numberOfMessages; i++){
                try{
                    String message = generateText(sizeOfMessage);
                    produceMessage(message);
                }
                catch (Exception e) {
                    logger.error("Caught exception while sending message", e);
                }
            }

واستمر هذا الوضع على الانتهاء دون أي مشاكل، ولقد تأكد هذا مع الشيكات على موقع الادارة، التي لديها العدد الصحيح من الرسائل المعلقة.

وتحدث هذه المشكلة عندما أحاول أن تتلقى رسائل من قائمة الانتظار. استخدام المستهلك البسيط لقراءة من قائمة الانتظار، فإنه سيتم قراءة عدد مختلف من الرسائل من قائمة الانتظار، ولكن بعد ذلك سوف تتوقف عند محاولة الحصول على واحدة من الرسائل. أستطيع أن أرى أنه لا تزال هناك رسائل في قائمة الانتظار إلى أن يقرأ، ولكن العميل لن التقدم مرت إحدى الرسائل. أنا باستخدام طريقة بسيطة لتلقي الرسائل:

Message message = jmsTemplate.receive();

وكان يعمل لبعض الرسائل (حوالي 20-30) ولكن بعد ذلك الأقفال فقط. واقترح لي أن بعض الأحرف في الرسالة قد تكون حرف هروب (كنت تستخدم سلسلة عشوائية متفاوتة الطول، ونتيجة لهذا فقط ويجري اختبار الأداء، وليس ارسال الواقع أكثر من أي محتوى) حتى لقد غيرت كل الرسائل لنفس السلسلة، والذي هو تكرار للحرف "2" والحظ لا يوجد حتى. أنا أستخدم التكوين الربيع لتحميل كافة العناصر اللازمة للوصول إلى طابور ActiveMQ، وقائمة الانتظار يعمل على بلدي المضيف المحلي.

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

المحلول

وليس هناك الكثير من وجهات النظر حول هذا بعد، ولكن للرجوع إليها في المستقبل إذا كان أي شخص لديه نفس المشكلة، ولقد وجدت الحل. تكوين لactiveMQ يحد من مقدار الذاكرة المستخدمة من قبل المرسلين والمتلقين قبل أن يتباطأ عليهم، وكانت القيم الافتراضية المعطاة لي:

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb" name="foo"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>

وأزلت هذا التكوين تماما، والآن يعمل حلم. أنا تنفيذ اختبار الأداء، لذلك قد ترغب في وضع القيود الخاصة بك في، ولكن هذا بالتأكيد سبب مشاكلي!

نصائح أخرى

عن قضية الكلاسيكية مع الرسائل. ما يجب القيام به مع المستهلكين بطيئة. FWIW النشرات ActiveMQ أكثر حداثة مثل 5.2 تسمح لك التخزين المؤقت على القرص بدلا من عرقلة المنتجين عندما يحصل نقص في الذاكرة

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