2013-11-27 12 views
5

से सभी संदेश प्राप्त करता है मैं कुछ उपकरण बनाना चाहता हूं जो कतार के अंदर संदेशों को प्रबंधित करने में सक्षम होंगे। इसलिए मैं कतार से कुछ संदेश प्राप्त करने में सक्षम होना चाहता हूं (निर्यात की तरह कुछ) और इसे वहां से न हटाएं।ActiveMQ कतार

मैं JMX एपीआई का उपयोग करने की कोशिश की:

ObjectName mbeanNameQueue = new ObjectName("org.apache.activemq:type=Broker,brokerName=static-broker1,destinationType=Queue,destinationName=tmp_queue2"); 
    org.apache.activemq.broker.jmx.QueueViewMBean queueView = JMX.newMBeanProxy(mbsc, mbeanNameQueue, org.apache.activemq.broker.jmx.QueueViewMBean.class); 
    System.out.println(queueView.browseAsTable()); 

लेकिन मैं 400 से अधिक संदेश नहीं प्राप्त कर सकते हैं।

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:55901"); 
    ActiveMQConnection connection = (ActiveMQConnection)connectionFactory.createConnection(); 
    DestinationSource ds = connection.getDestinationSource(); 

    QueueSession queueSession = connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE); 
    Queue queue = queueSession.createQueue("tmp_queue2"); 
    QueueBrowser browser = queueSession.createBrowser(queue); 
    Enumeration<?> messagesInQueue = browser.getEnumeration(); 

    while (messagesInQueue.hasMoreElements()) { 
     Message queueMessage = (Message) messagesInQueue.nextElement(); 
     System.out.println(queueMessage); 
    } 

लेकिन messagesInQueue.hasMoreElements() हमेशा कतार के बावजूद झूठी रिटर्न शामिल कई संदेश:

इसके अलावा, मैं इस तरह के दृष्टिकोण का इस्तेमाल किया।

यदि मैं उपभोक्ता का उपयोग करने का प्रयास करता हूं तो यह सभी संदेशों को पुनर्प्राप्त करता है लेकिन यह इसे कतार से हटा देता है।

मैं कमांड लाइन उपकरण का उपयोग कर कतार से संदेशों को निर्यात करने की कोशिश की:

activemq browse --amqurl tcp://localhost:55901 tmp_queue2 >> messages22222.txt 

लेकिन अगर कतार 1000000 के बारे में संदेश होता है यह

Failed to execute main task. Reason: java.lang.OutOfMemoryError: GC overhead limit exceeded 

तो, मैं सभी संदेशों को फार्म कैसे प्राप्त कर सकते हैं फेंकता कतार और उन्हें वहां से नहीं हटाते?

+1

जब कोई संदेश नहीं दिया जाता है, तो शायद आपको कनेक्शन शुरू करना चाहिए। ब्राउज़र से संदेशों को फिर से शुरू करने से पहले या ब्राउज़र ऑब्जेक्ट बनाने से पहले कनेक्शन .start() पर कॉल करें। जेएमएस विनिर्देश का कहना है कि संदेश लेने से पहले कनेक्शन शुरू करने की आवश्यकता है, ब्राउजिंग को कैसे काम करना चाहिए, इस बारे में कोई शब्द नहीं है, लेकिन ब्राउजिंग इतनी आम गतिविधि नहीं है, एक्टिवएमक्यू ने इसे शायद ही लागू कर दिया है। – Matej

+0

@Matej, धन्यवाद, मैं कनेक्शन शुरू करना भूल गया। जब मैंने इसे शुरू किया तो मैं कतार से लगभग 5000 संदेश पढ़ सकता था लेकिन फिर यह अगले तत्व को पुनर्प्राप्त करते समय लंबे समय तक रुक गया .... – evgeniy44

उत्तर

6

जेएमएस क्यूई ब्राउज़र कोई गारंटेंट नहीं करता है कि यह कतार में प्रत्येक संदेश को वापस कर देगा। यह संदेशों का एक स्नैपशॉट प्रदान करता है लेकिन उन्हें सभी नहीं दे सकता है। ActiveMQ के मामले में ओवरहेड को कम करने के लिए कितने संदेश ब्राउज़ करेंगे इस पर सीमाएं हैं। आप सीमा बढ़ा सकते हैं, maxBrowsePageSize देखें, हालांकि अभी भी यह सुनिश्चित करने का कोई तरीका नहीं है कि बहुत गहरी कतार के लिए आप उन्हें सब कुछ प्राप्त करेंगे।

एक बेहतर विकल्प एक ऊंट मार्ग का उपयोग करना होगा जो कुछ कतार में लक्षित कुछ संदेशों में लक्षित संदेश भेजता है कतार और एक दर्पण कतार जिसे आप मानक जेएमएस उपभोक्ताओं या किसी अन्य ऊंट मार्ग का उपयोग करके निकाल सकते हैं। इस तरह आप प्रतिबिंबित संदेशों को अपनी गति से उपभोग कर सकते हैं।

+1

दर्पण कतार मेरी समस्या को हल करने का एक अच्छा तरीका है, धन्यवाद! – evgeniy44

0

messagesInQueue.hasMoreElements() हमेशा गलत रिटर्न क्योंकि आप

connection.start(); 

कॉल करना होगा इससे पहले कि कतार पुनरावृति।

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