2011-12-13 19 views
6

JMS एपीआई दस्तावेज़ में, यह कहा:जेएमएस कतार संदेश प्राप्त करते हैं?

public Message receive() throws JMSException 

अगले संदेश इस संदेश को उपभोक्ता के लिए उत्पादन प्राप्त करता है। यह कॉल अनिश्चित काल तक अवरुद्ध करता है जब तक कोई संदेश नहीं बनाया जाता है या जब तक यह संदेश उपभोक्ता बंद नहीं होता है।

यदि यह लेनदेन के भीतर किया जाता है, तो उपभोक्ता लेनदेन तक संदेश को तब तक बरकरार रखता है जब तक लेनदेन नहीं होता है।

यहां मेरे तीन प्रश्न हैं: 1. कोड में, हमें संदेश प्राप्त करने के लिए जबकि लूप की आवश्यकता है? जैसे:

while(true){ 
    Message msg = queue.receive(); 
    .... 
} 
  1. लेनदेन सेटिंग क्या है? लेनदेन कैसे करें? इस तरह:

    boolean transacted = false; 
    session = connection.createQueueSession(transacted, Session.AUTO_ACKNOWLEDGE); 
    
  2. प्राप्तNoWait() लेनदेन का समर्थन है? इसका इस्तेमाल कैसे करें ?

धन्यवाद

उत्तर

3
  1. आपको प्राप्त उपयोग करने के लिए तो आप पाश के कुछ प्रकार की जरूरत के बाद पहले एक प्राप्त होता है संदेश प्राप्त करते रहने होगा जा रहे हैं। याद रखें कि आप एक मैसेजलिस्टर भी सेट कर सकते हैं और कॉलबैक विधि के माध्यम से प्राप्त संदेश एसिंक प्राप्त कर सकते हैं और ब्लॉक करना नहीं है।

  2. लेनदेन आम तौर पर डिफ़ॉल्ट रूप से AUTO_ACKNOWLEDGE पर सेट होता है जिसका अर्थ है कि जैसे ही संदेश कतार से लिया जाता है, यह समाप्त हो जाता है और इसे वापस नहीं किया जा सकता है। यदि आप एक लेनदेन स्थापित करना चाहते हैं तो आपको सत्र को संसाधित करने और SESSION_TRANSACTED की विधि सेट करने की आवश्यकता है। जब आप सत्र पर प्रतिबद्ध() को कॉल करते हैं तो संदेशों को कतार पर स्वीकार किया जाएगा।

  3. प्राप्तNoWait() प्राप्तकर्ता लेनदेन समर्थन हो सकता है यदि आप स्वीकृति मोड सही ढंग से सेट करते हैं और आप सत्र पर प्रतिबद्ध() और रोलबैक() का उपयोग करते हैं।

अगर मैं तुम्हें थे मैं एक MessageListener बन जाएगा और प्राप्त तरीकों मतदान पर एक धागा कताई के बारे में चिंता करने की जरूरत नहीं। ध्यान रखें कि सत्र बनने के बाद एक निहित लेनदेन शुरू हो जाता है।

public class JmsAdapter implements MessageListener, ExceptionListener 
{ 
    private ConnectionFactory connFactory = null; 
    private Connection conn = null; 
    private Session session = null; 

    public void receiveMessages() 
    { 
     try 
     { 
      this.session = this.conn.createSession(true, Session.SESSION_TRANSACTED); 

      this.conn.setExceptionListener(this); 

      Destination destination = this.session.createQueue("SOME_QUEUE_NAME"); 

      this.consumer = this.session.createConsumer(destination); 

      this.consumer.setMessageListener(this); 

      this.conn.start(); 
     } 
     catch (JMSException e) 
     { 
      //Handle JMS Exceptions Here 
     } 
    } 

    @Override 
    public void onMessage(Message message) 
    { 
     try 
     { 
      //Do Message Processing Here 

      //Message sucessfully processed... Go ahead and commit the transaction. 
      this.session.commit(); 
     } 
     catch(SomeApplicationException e) 
     { 
      //Message processing failed. 
      //Do whatever you need to do here for the exception. 

      //NOTE: You may need to check the redelivery count of this message first 
      //and just commit it after it fails a predefined number of times (Make sure you 
      //store it somewhere if you don't want to lose it). This way you're process isn't 
      //handling the same failed message over and over again. 
      this.session.rollback() 
     } 
    } 
} 
+0

यदि लेनदेन का उपयोग करते हैं, तो यह प्रदर्शन को कम कर देगा? – user595234

+0

लेनदेन JMS सर्वर पर ओवरहेड लगाता है क्योंकि यह आपके द्वारा किए जाने तक संदेशों को जारी नहीं कर सकता है। – gregwhitaker

+0

आप जावा के साथ जेएमएस पर कुछ प्रदर्शन अनुशंसाओं के लिए निम्नलिखित पर भी विचार कर सकते हैं: http://www.precisejava.com/javaperf/j2ee/JMS.htm – gregwhitaker

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