2013-08-12 16 views
7

से संदेश प्राप्त नहीं कर रहा है हम ActiveMQ और उसके उपभोक्ताओं के साथ एक यादृच्छिक समस्या का सामना कर रहे हैं। हम देखते हैं कि, कुछ उपभोक्ता संदेश प्राप्त नहीं कर रहे हैं, भले ही वे ActiveMQ कतार से जुड़े हों। लेकिन उपभोक्ता पुनरारंभ करने के बाद यह ठीक काम करता है।उपभोक्ता ActiveMQ

हमारे पास ActiveMQ पक्ष पर testQueue नामक एक कतार है। एक उपभोक्ता इस कतार से संदेशों को कतारबद्ध करने का प्रयास कर रहा है। हम इस उद्देश्य के लिए स्प्रिंग के DefaultMessageListenerContainer का उपयोग कर रहे हैं। सक्रिय एमक्यू ब्रोकर से उपभोक्ता नोड को संदेश दिया जा रहा है। टीसीपीडम्प से भी, यह स्पष्ट था कि संदेश उपभोक्ता नोड तक पहुंच रहा है, लेकिन वास्तविक उपभोक्ता कोड संदेश देखने में सक्षम नहीं है। दूसरे शब्दों में, यह संदेश ActiveMQ उपभोक्ता कोड या स्प्रिंग के डिफ़ॉल्ट मैसेज लिस्टरनर कंटेनर में फंस गया प्रतीत होता है।

नीचे दिए गए अंजीर को देखें। इस मुद्दे पर अधिक स्पष्टता के लिए। संदेश उपभोक्ता नोड तक पहुंच रहा है, लेकिन यह "वास्तविक उपभोक्ता वर्ग" तक नहीं पहुंच रहा है, जिसका अर्थ यह है कि संदेश एएमक्यू उपभोक्ता कोड या स्प्रिंग डीएमएलसी में फंस गया है।

enter image description here

नीचे दिए गए विवरण ActiveMQ व्यवस्थापक से कब्जा कर लिया है।

कतार-नाम/विचाराधीन-संदेश-गणना/उपभोक्ता-गणना/संदेश-कतारबद्ध/संदेश-Dequeued testQueue/9/1/9/0

नीचे अधिक जानकारी के कर रहे हैं।

कनेक्शन ID/sessionid/चयनकर्ता/Enqueues/Dequeues/भेजा/भेजा-पंक्ति/प्रीफ़ेच ID: bearsvir52-45176-1375519181268-3: 5/1// 9/0/9/9/250

दूसरी तालिका से यह स्पष्ट है कि उपभोक्ता को संदेश वितरित किए जा रहे हैं, लेकिन उपभोक्ता संदेश को स्वीकार नहीं कर रहा है। इसलिए संदेश ब्रोकर पक्ष में प्रेषित-कतार में फंस गए हैं।

आपकी जानकारी में के लिए कुछ अंक:

1) ख w ब्रोकर नोड और उपभोक्ता नोड/कुछ ही समय का अंतर है।

2) उपभोक्ता पक्ष पर tcpdump का निरीक्षण किया। हम संदेश डिस्पैच (ओपनवायर) पैकेट को उपभोक्ता नोड में स्थानांतरित कर सकते हैं, लेकिन इसके लिए MessageAck (Openwire) नहीं मिला।

3) कभी-कभी यह नोड पर काम कर रहा है, और कभी-कभी यह उसी नोड पर समस्या पैदा कर रहा है।

+0

आप स्प्रिंग config कि ConectionFactory, DMLC और श्रोता वर्ग से पता चलता अप पोस्ट कर सकते हैं जोड़ा? –

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है। क्या आपको एक संकल्प मिला? –

+0

कोई अद्यतन? मेरे पास एक ही समस्या है – Nereis

उत्तर

2

समाधान को समझने में काफी समय लगा। एएमक्यू असफल होने के मामले में org.apache.activemq.ActiveMQConnection.java कक्षा के साथ कुछ समस्या प्रतीत होती है। ऐसे मामलों में उपभोक्ता पक्ष में कनेक्शन ऑब्जेक्ट शुरू नहीं हो रहा है।

यह तय है कि मैंने ActiveMQConnection.java फ़ाइल में जोड़ा है और activemq-core-x.x.x बनाने के लिए स्रोतों को संकलित किया है।जार

private final Object startMutex = new Object(); 

createSession विधि में एक चेक

public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException { 
    synchronized (startMutex) { 
     if(!isStarted()) { 
      start(); 
     } 
    } 
1

इसका एक कारण एक श्रोता कंटेनर के साथ CachingConnectionFactory (कैश किए गए उपभोक्ताओं के साथ) का गलत उपयोग कर सकता है जो गतिशील रूप से उपभोक्ताओं को समायोजित करता है (अधिकतम उपभोक्ता> उपभोक्ता)। आप बस एक पूल में बैठे कैश किए गए उपभोक्ता के साथ समाप्त हो सकते हैं और सक्रिय रूप से उपयोग नहीं किया जा रहा है। आपको श्रोता कंटेनर के साथ उपभोक्ताओं को कैश करने की आवश्यकता नहीं है।

इस तरह की समस्याओं के लिए, मैं आम तौर पर ट्रेसी लॉगिंग के साथ चलने की अनुशंसा करता हूं और आप सभी उपभोक्ता गतिविधि देख सकते हैं।

संबंधित मुद्दे