2010-08-09 11 views
9

मेरे पास एक जेएमएस क्लाइंट है जो संदेश प्राप्त करने पर रिमोट सिस्टम को एसएसएच कर सकता है (और वहां विभिन्न चीजें करता है - प्रश्न से प्रासंगिक नहीं)। यह संभव है कि ऐसे सैकड़ों संदेश थोड़े समय में आएंगे जिन्हें ASAP को संसाधित करने की आवश्यकता है।जेएमएस संदेश पुनः वितरण डिलीवरी

हालांकि, यह भी संभव है कि संदेश प्राप्त होने पर कुछ रिमोट सिस्टम उपलब्ध न हों, इसलिए उन्हें बाद में स्थगित कर दिया जाना चाहिए (उदाहरण के लिए 1 घंटा या तो)। सबसे अच्छा समाधान संदेश को कुछ "देरी" मान सेट के साथ कतार में वापस रखना होगा, जो जेएमएस ब्रोकर को एक घंटे के भीतर संदेश को फिर से वितरित करने का प्रयास नहीं करेगा।

ठीक नहीं है: प्राप्त करने वाले धागे में सो जाओ और एक घंटे बाद उठो। चूंकि संदेश उपभोक्ता पूल सीमित है (उदाहरण के लिए 8 कनेक्शन उपलब्ध हैं) जिसमें 8 गैर-पहुंच योग्य सिस्टम हैं, पूरी प्रक्रिया को अनावश्यक रूप से अवरुद्ध कर देंगे, जो अस्वीकार्य है।

मुझे संदेश या कतार के लिए स्वयं को "देरी" मान के लिए कोई सेटिंग नहीं मिली, क्या यह अस्तित्व में है?

एक वर्कअराउंड समाधान पहुंचने योग्य सिस्टम पर संदेशों को संग्रहीत करने के लिए दूसरी कतार का उपयोग करना है, और इन्हें अलग से संसाधित करना है। लेकिन यह एक बहुत ही सुरुचिपूर्ण समाधान नहीं है, और अतिरिक्त प्रोग्रामिंग की आवश्यकता है। शायद एक बेहतर तरीका है।

उत्तर

3

जेएमएस 2.0 से पहले जेएमएस एपीआई के माध्यम से यह संभव नहीं है। एक सामान्य नियम के रूप में, संदेश ट्रांसपोर्ट को यथासंभव तेज़ी से संदेश वितरित करने के लिए अनुकूलित किया जाता है और कुछ मनमाने ढंग से अंतराल पर पुनर्विक्रेता के लिए संदेश रखने के लिए शेड्यूलर की कमी होती है। मान लीजिए कि एक परिवहन प्रदाता है जिसमें ऐसी कार्यक्षमता है, जो कुछ भी आप लिखते हैं वह उस परिवहन प्रदाता से बंधेगा क्योंकि यद्यपि कोड जेएमएस-अनुरूप हो सकता है, ऐप स्वयं ही इस विक्रेता-विशिष्ट व्यवहार पर निर्भर करेगा।

@ शशि का जवाब उस उत्तर के लिए देखें जो एमएमसी 2.0 का समर्थन करने वाले एमक्यू के संस्करणों पर लागू होता है।

+0

यह एक सूचनात्मक उत्तर है, धन्यवाद। – egbokul

+1

मुझे लगता है कि यह केवल जेएमएस 1.0 के लिए सच था? (सीएफ शशि का जवाब) – jpaugh

+1

यूप। नए एमक्यू जेएमएस कक्षा वितरण में देरी का समर्थन करते हैं। –

4

इस परिस्थितियों में, कंटेनर प्रबंधित लेनदेन का उपयोग किया जाता है। लेनदेन शुरू होता है जब onMessage विधि को कंटेनर द्वारा बुलाया जाता है और onMessage विधि सफलतापूर्वक समाप्त हो जाती है (यह तब विफल हो जाएगा जब RuntimeException फेंक दिया जाता है या setRollBackOnly को संदेश DrivenBean संदर्भ से बुलाया जाता है)। आप पुनर्विक्रय अंतराल और पुनर्विक्रय की अधिकतम संख्या को भी कॉन्फ़िगर कर सकते हैं।

यदि आप ग्लासफ़िश सर्वर के साथ ओपनएमक्यू का उपयोग कर रहे हैं, तो आप इसे ejb-jar.xml descriptor के अंदर कॉन्फ़िगर कर सकते हैं। Ejb-jar.xml descriptor के अंदर गुणों को endpointExceptionRedeliveryInterval (मिलीसेकंड में) और endpointExceptionRedeliveryAttempts (मृत संदेश कतार में भेजे जाने से पहले संदेश को फिर से वितरित करने की संख्या) सेट करें। यहाँ एक उदाहरण है:

<?xml version="1.0" encoding="UTF-8"?> 
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd" 
    version="3.1">  
    <enterprise-beans> 
     <message-driven> 
      <ejb-name>EjbName</ejb-name> 
      <ejb-class>com.example.MyMessageDrivenBean</ejb-class> 
      <messaging-type>javax.jms.MessageListener</messaging-type> 
      <transaction-type>Container</transaction-type> 
      <activation-config> 
       <activation-config-property> 
        <activation-config-property-name>destination</activation-config-property-name> 
        <activation-config-property-value>someQueue</activation-config-property-value> 
       </activation-config-property> 
       <activation-config-property> 
        <activation-config-property-name>destinationType</activation-config-property-name> 
        <activation-config-property-value>javax.jms.Queue</activation-config-property-value> 
       </activation-config-property> 

       <activation-config-property> 
        <activation-config-property-name>endpointExceptionRedeliveryInterval</activation-config-property-name> 
        <activation-config-property-value>5000</activation-config-property-value> 
       </activation-config-property> 
       <activation-config-property> 
        <activation-config-property-name>endpointExceptionRedeliveryAttempts</activation-config-property-name> 
        <activation-config-property-value>4</activation-config-property-value> 
       </activation-config-property> 
      </activation-config> 
     </message-driven> 
    </enterprise-beans> 
</ejb-jar> 

और संदेश प्रेरित सेम के अंदर के रूप में असफल रहे और संदेश कतार को लौटा दी जाएगी में चिह्नित करने के लिए एक RuntimeException फेंक देते हैं। http://docs.oracle.com/cd/E12839_01/apirefs.1111/e13952/pagehelp/JMSjmstemplatesjmstemplateconfigredeliverytitle.html

+0

सूर्य-ejb.jar.xml भी इस्तेमाल किया जा सकता है। https://docs.oracle.com/cd/E19798-01/821-1750/beaqm/index.html – 99Sono

0

मैं समस्या के रूप में देखेंगे:

यहाँ भी WebLogic सर्वर के लिए विन्यास गुण हैं jms संदेश उपभोक्ता पूल उपलब्ध है ... जबकि कुछ बैकएंड संसाधनों (यानी ssh) उपलब्ध नहीं हैं संदेश को पूरा करने की अनुमति देने के लिए।

यदि आप इससे सहमत हैं तो समस्या यह है कि उपभोक्ता-पूल क्यों उपलब्ध है क्योंकि यह खपत को पूरा नहीं कर सकता है? यदि आपके पास पूल उपलब्ध नहीं था तो संदेश कतार में ढेर हो जाएंगे .... उपलब्ध होने तक ...और उपलब्ध होने पर जारी रखना ठीक हो सकता था। फिर यदि ऐसा है तो संसाधनों के उपलब्ध होने पर पूल को शुरू/बंद करने के लिए आपको केवल एक निगरानी घटक की आवश्यकता है। आपको 1hr प्रतीक्षा करने की आवश्यकता नहीं है, लेकिन जब तक बैकएंड उपलब्ध नहीं है। अंत में जेएमएस पर सब कुछ है लेकिन एक निगरानी उपकरण नहीं है।

9

जेएमएस 2.0 विशिष्टता "डिलिवरी देरी" को परिभाषित करती है जहां ग्राहक भेजता प्रत्येक संदेश के लिए मिलीसेकंड में डिलीवरी देरी मान निर्दिष्ट कर सकता है। यह मान एक संदेश वितरण समय को परिभाषित करता है जो संदेश की डिलीवरी देरी का योग है और जीएमटी भेजा जाता है (लेनदेन के लिए भेजा जाता है, यही वह समय है जब ग्राहक संदेश भेजता है, लेनदेन के समय के समय नहीं)।

एक संदेश का डिलीवरी का समय सबसे पुराना समय है जब एक जेएमएस प्रदाता लक्षित गंतव्य पर संदेश संदेश और उपभोक्ताओं को डिलीवरी के लिए उपलब्ध करा सकता है। प्रसव के समय तक पहुंचने से पहले प्रदाता को संदेश वितरित नहीं करना चाहिए।

यह सुविधा ऊपर वर्णित परिदृश्य के लिए काफी आसान है।

0

ग्लासफ़िश पर, निम्नलिखित संदर्भ उपयोग किए जा सकते हैं।

https://docs.oracle.com/cd/E19798-01/821-1794/aeooq/index.html

उपरोक्त संदर्भ आपको लगता है कि glassfish द्वारा समर्थित हैं सक्रियण गुण की एक सूची प्राप्त पर

। ईजी। endpointExceptionRedeliveryAttempts -
किए जाने की संख्या संदेश डिलीवर करने के लिए जब एमडीबी संदेश प्रसव के दौरान एक अपवाद फेंकता

फिर

आपके पास निम्न संदर्भ कि मान्य XML तत्व का वर्णन करता धूप में EJB-jar.xml, जो द्वारा समर्थित है पर उपयोग करने के लिए कांच की मछली। https://docs.oracle.com/cd/E19798-01/821-1750/beaqm/index.html

अंत में, आप निम्न स्निपेट में चित्रित एक एमडीबी कॉन्फ़िगर कर सकते हैं।

<ejb> 
    <ejb-name>MyMdbWith0MsRedeliveryDelayAndMultipleRedeliveriesMdb</ejb-name> 
    <bean-pool> 
     <steady-pool-size>1</steady-pool-size> 
     <resize-quantity>1</resize-quantity> 
     <max-pool-size>1</max-pool-size> 
    </bean-pool> 
    <mdb-resource-adapter> 
     <activation-config> 
      <activation-config-property> 
       <activation-config-property-name>endpointExceptionRedeliveryAttempts</activation-config-property-name> 
       <activation-config-property-value>1000</activation-config-property-value> 
      </activation-config-property> 
      <activation-config-property> 
       <activation-config-property-name>endpointExceptionRedeliveryAttempts</activation-config-property-name> 
       <activation-config-property-value>0</activation-config-property-value> 
      </activation-config-property> 
     </activation-config>    
    </mdb-resource-adapter> 
</ejb> 

यह सुनिश्चित करना चाहिए कि इस विशेष mdb के लिए, glassfish तत्काल संदेश वितरित कर देगा और अगर यह विफल रहता है यह इसे तुरंत पुनः प्रयास करेगा।

अपनी WAR प्रोजेक्ट में, एक उप-ejb-jar.xml बनाएं और इसे WEB-INF/sun-ejb-jar.xml के अंतर्गत रखें।

यदि आप मेवेन का उपयोग कर रहे हैं, तो यह युद्ध प्रोजेक्ट घटक पर आपका src/main/webapp/WEB-INF/sub-ejb-jar.xml पथ होगा।