2012-01-15 22 views
5

में संदेशों की स्वत: समाप्ति मेरे पास कुछ सर्वरों के बीच संचार के लिए ऊंट और ActiveMQ लागू करने वाली एक प्रणाली है। मैं जानना चाहता हूं कि एक्स अवधि के बाद कतार में भेजे गए संदेशों को स्वचालित रूप से समाप्त करने और साफ़ करने का कोई तरीका है या नहीं। चूंकि मूल सर्वर (कतार भरना) यह नहीं जानता कि कोई संदेश उठा रहा है, तो मैं नहीं चाहता कि मेरी कतार तब तक बढ़े जब तक कि कुछ क्रैश न हो जाए। बोनस कर्म किसी ऐसे व्यक्ति को इंगित करता है जो इस सुविधा को लागू करने के लिए जावा डीएसएल मार्ग की सहायता और प्रदान कर सकता है। आप संदेशों पर समाप्ति सेट करने के लिए के लिएऊंट

समाधान

// expire message after 2 minutes 
long ttl = System.currentTimeMillis() + 120000; 
// send our info one-way to the group topic 
camelTemplate.sendBodyAndHeader("jms:queue:stats", ExchangePattern.InOnly, stats, "JMSExpiration", ttl); 

उत्तर

1

खैर setJMSExpiration (लंबी समाप्ति):

कुछ है आप नहीं करना चाहिए जब आप ग्राहक हों तो कॉल करें। ActiveMQ फ़ोरम पर इस पर मेरी बात देखें।

http://apache-qpid-developers.2158895.n2.nabble.com/MRG-Java-JMS-Expiration-td7171854.html

+0

देता हूं फोरम पर आपके संदेश में ऐसा लगता है कि आप 10 मिनट की समाप्ति चाहते थे लेकिन इसके बजाय 10 सेकंड सेट किया था। पूर्व। (10 * (60 * 1000)) बनाम (10 * 1000) –

+0

@ मॉन्डन नहीं, मैं 10 सेकंड चाहता था। कतारों से समाप्त होने वाले संदेशों को साफ़ होने पर 10 मिनट एक क्यूपीआईडी ​​डिफ़ॉल्ट सेटिंग होती है। उदाहरण के लिए: आपने कतार में एक संदेश भेजा है जिसमें समाप्ति सेट 10 सेकंड तक है, इसलिए 10 सेकंड के बाद संदेशों को क्यूपीआईडी ​​द्वारा समाप्त कर दिया गया है और कोई भी उपभोक्ता इसका उपभोग नहीं कर सकता है, लेकिन वास्तव में संदेश को हटाया जाता है जब क्यूपीआईडी ​​को हटाया जाता है जब रिमूवल पॉलिसी थ्रेड (एस) किक इन, और डिफ़ॉल्ट सेटिंग यह है कि वे 10 मिनट – Eugene

+0

ठीक बाद में लाते हैं, ठीक है, मैंने वहां जो पोस्ट किया था उसे गलत समझा। –

3

भी मन है कि के बीच ग्राहक घड़ियों - दलाल समाप्ति ठीक से काम करने के लिए, सिंक में होना चाहिए। यदि घड़ियों सिंक में नहीं हैं, तो ग्राहक से समाप्त होने वाली समाप्ति, ब्रोकर पर संदेश प्राप्त होने पर पहले से ही समाप्त हो सकता है। या ग्राहक का समय दलाल से आगे है, इसलिए समाप्ति 10 सेकंड से अधिक है।

यह मुझे बताता है कि समाप्ति ग्राहक समय आधारित क्यों है। तो एएमक्यू एक प्लगइन प्रदान करता है, जो समय को रीयललाइन करके इसे ठीक करने के लिए, केवल ब्रोकर आधारित होता है। http://activemq.apache.org/timestampplugin.html

1

हमारी ओर से हम ActiveMQ सेवा में तैनात ऊंट मार्ग का उपयोग कर विशिष्ट स्थलों पर समाप्ति समय जोड़ना चुनते हैं।

ऐसा करने के लिए एकमात्र चीज एक्सएमएल फ़ाइल बनाना जैसे नाम के साथ निम्नलिखित है। setJMSExpiration.xml:

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
    http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd 
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <camelContext id="camel-set-expiration" xmlns="http://camel.apache.org/schema/spring"> 
    <!-- Copy route for each destination to expire --> 
    <route id="setJMSExpiration.my.queue.dlq"> 
     <from uri="broker:queue:MY.QUEUE.DLQ"/> 
     <setHeader headerName="JMSExpiration"> 
      <!-- Message will expire after 1 day --> 
      <spel>#{T(java.lang.System).currentTimeMillis() + 86400000}</spel> 
     </setHeader> 
     <to uri="broker:queue:MY.QUEUE.DLQ"/> 
    </route> 
    <route id="setJMSExpiration.another.queue"> 
     <from uri="broker:queue:ANOTHER.QUEUE"/> 
     <setHeader headerName="JMSExpiration"> 
      <!-- Message will expire after 5 days --> 
      <spel>#{T(java.lang.System).currentTimeMillis() + 432000000}</spel> 
     </setHeader> 
     <to uri="broker:queue:ANOTHER.QUEUE"/> 
    </route> 
    </camelContext> 
</beans> 

और के साथ अपने activemq.xml config में आयात:

<!-- Add default Expiration (file in the same directory) --> 
<import resource="setJMSExpiration.xml"/> 

वैकल्पिक रूप से आप भी विशिष्ट per destination policies प्रदान कर सकते हैं यदि आप नहीं करते की अवधि समाप्त हो गए संदेशों ActiveMQ.DLQ कतार पहुंचना चाहते हैं।

<policyEntry queue="MY.QUEUE.DLQ"> 
    <deadLetterStrategy> 
     <sharedDeadLetterStrategy processExpired="false" /> 
    </deadLetterStrategy> 
</policyEntry> 
<policyEntry queue="ANOTHER.QUEUE"> 
    <deadLetterStrategy> 
     <sharedDeadLetterStrategy processExpired="false" /> 
    </deadLetterStrategy> 
</policyEntry> 

इस तरह का केवल सीमा यह है कि आप आसानी से वाइल्डकार्ड का उपयोग नहीं कर सकते हैं के रूप में यह यहाँ कोडित है (आप कर सकते हैं, लेकिन यह ऊंट मार्ग में JMS गंतव्य हैडर का उपयोग करके कुछ रूपांतरों की आवश्यकता होगी) है।

हम निर्माता को समय को परिभाषित करने की कोशिश करते हैं (और जितना संभव हो सके उन्हें मजबूर करें) लेकिन इन मार्गों की संख्या को कम करने के लिए उन्हें अपने कोड को बदलने के लिए मजबूर करना हमेशा संभव नहीं होता है।

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