2011-02-08 26 views
17

पर डुप्लिकेट किए गए संदेशों से बचें ActiveMQ सर्वर पर परिभाषित कतार पर डुप्लिकेट संदेशों को दबाने का एक तरीका है?जेएमएस/एक्टिवएमक्यू

मैंने मैन्युअल रूप से JMSMessageID को परिभाषित करने का प्रयास किया, (message.setJMSMessageID ("uniqueid")), लेकिन सर्वर इस संशोधन को अनदेखा करता है और अंतर्निर्मित जेएमएसएमसेज आईडी के साथ एक संदेश प्रदान करता है।

विनिर्देशन से, मुझे संदेशों को deduplicate करने के बारे में कोई संदर्भ नहीं मिला।

हॉर्नेटक में, इस समस्या से निपटने के लिए, हमें संदेश परिभाषा पर मुख्यालय विशिष्ट संपत्ति org.hornetq.core.message.impl.HDR_DUPLICATE_DETECTION_ID घोषित करने की आवश्यकता है।

यानी .:

Message jmsMessage = session.createMessage(); 
String myUniqueID = "This is my unique id"; // Could use a UUID for this 
message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID); 

किसी को जानता हो, तो ActiveMQ के लिए एक समान समाधान?

उत्तर

7

आप अपाचे ऊंट पर गौर करना चाहिए, यह एक idempotent उपभोक्ता घटक है कि किसी भी JMS प्रदाता के साथ काम करेगा प्रदान करता है, देखें: http://camel.apache.org/idempotent-consumer.html

का उपयोग करना है कि ActiveMQ घटक काफी सरल JMS का उपयोग कर बनाता है के साथ संयोजन में, देखें: http://camel.apache.org/activemq.html

+1

मुझे संदेह है कि यह विधि मेरी समस्या का समाधान करेगी। मुझे इस उदाहरण के दौरान कतार में ही एक ही JMSMessageID के साथ संदेश का केवल एक उदाहरण रखना होगा। मुझे इसे सेट के रूप में काम करने की ज़रूरत है। कतार से नवीनतम idem तत्व हटा दिए जाने के बाद मैं एक ही JMSMessageID के साथ अन्य संदेश डाल सकता हूं। मुझे इसे लागू करने और परीक्षण करने की आवश्यकता है। लेकिन, ईएआई पुस्तक पर वर्णित इडेमपोटेन्ट पर आधारित, मुझे लगता है कि अवधारणा मेरी आवश्यकता से मेल नहीं खाती है। बीयूटी, प्रस्तावित समाधान अच्छा है। मैं इसके बारे में और अधिक पढ़ूंगा और यहां अपने परिणामों पर टिप्पणी करूंगा। धन्यवाद – apast

4

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

मुझे पिछले लाइनों के साथ पिछले स्टैक ओवरफ्लो प्रश्न दिखाई देता है - Apache ActiveMQ 5.3 - How to configure a queue to reject duplicate messages?, जो भी मदद कर सकता है।

3

एक जेएमएस संपत्ति के आधार पर डुप्लिकेट फ़िल्टर करने के लिए ActiveMQ बनाने का एक तरीका है। इसमें एक ActiveMq Plugin लिखना शामिल है। एक बुनियादी दलाल फिल्टर कि deadletter कतार में डुप्लिकेट संदेश भेजता होगा इस

import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import org.apache.activemq.broker.Broker; 
import org.apache.activemq.command.Message; 
import org.apache.activemq.command.ActiveMQMessage; 
import org.apache.activemq.broker.BrokerFilter; 
import org.apache.activemq.broker.ConnectionContext; 
import org.apache.activemq.command.ConnectionInfo; 
import org.apache.activemq.broker.ProducerBrokerExchange; 

public class DuplicateFilterBroker extends BrokerFilter { 
    String messagePropertyName; 
    boolean switchValue; 

    public DuplicateFilterBroker(Broker next, String messagePropertyName) { 
     super(next); 
     this.messagePropertyName = messagePropertyName; 
    } 

    public boolean hasDuplicate(String propertyValue){ 
     switchValue = propertyValue; 
     return switchValue; 
    } 

    public void send(ProducerBrokerExchange producerExchange, Message msg) throws Exception { 
     ActiveMQMessage amqmsg = (ActiveMQMessage)msg; 
     Object msgObj = msg.getMessage(); 
     if (msgObj instanceof javax.jms.Message) { 
      javax.jms.Message jmsMsg = (javax.jms.Message) msgObj; 
      if (!hasDuplicate(jmsMsg.getStringProperty(messagePropertyName))) { 
       super.send(producerExchange, msg); 
      } 
      else { 
       sendToDeadLetterQueue(producerExchange.getConnectionContext(), msg); 
      } 
     } 
    } 
} 
+0

निश्चित रूप से इस समस्या को हल करने के लिए एक बहुत अच्छा तरीका है। – user1052080

3

की तरह अब है डुप्लिकेट संदेशों ActiveMQ में शामिल किया हुआ transports दूर करने के लिए समर्थन करते हैं। Connection Configuration Guide में कॉन्फ़िगरेशन मान auditDepth और auditMaximumProducerNumber देखें।

+3

डुप्लिकेट से बचने के लिए आप वास्तव में उन पैरामीटर को कैसे कॉन्फ़िगर करते हैं? – Thomas

+0

@ थॉमस मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। कैसे, सामान्य रूप से, ActiveMQ में कॉन्फ़िगरेशन लागू करने के लिए? या इन विशिष्ट क्षेत्रों के लिए किस मूल्य का उपयोग करना है? –

+0

यह सिर्फ पैरामीटर के विवरण से है जो मुझे इतना स्पष्ट नहीं लगता है। उदाहरण के लिए 'auditDepth', क्या मान का अर्थ है एनबी संदेशों या बाइट्स के एनबी जिन्हें डुप्लिकेशंस के लिए वापस स्क्रीन किया जाएगा? 'AuditMaximumProducerNumber' के संबंध में, क्या इसका मतलब यह है कि सीमित मात्रा में उत्पादक हैं जिन्हें स्क्रीनिंग किया जाएगा? बीटीडब्ल्यू, यदि एक ही सामग्री वाला संदेश 2 अलग-अलग ग्राहकों द्वारा प्रकाशित किया गया है, तो क्या संदेश को डुप्लिकेट माना जाता है? – Thomas

0

प्रश्न में सुझाए गए तरीके को समझें, ActiveMQ के लिए भी काम करता है (2016/12)। activemq-artemis मार्गदर्शिका देखें। इसके लिए निर्माता को संदेश में एक विशिष्ट संपत्ति सेट करने की आवश्यकता होती है।

Message jmsMessage = session.createMessage(); 
String myUniqueID = "This is my unique id"; // Could use a UUID for this 
message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID); 

हालांकि वर्ग संपत्ति युक्त अलग है: org.apache.activemq.artemis.core.message.impl.HDR_DUPLICATE_DETECTION_ID और संपत्ति मूल्य _AMQ_DUPL_ID है।