Avoiding duplicated messages on JMS/ActiveMQ

前端 未结 5 1460
时光取名叫无心
时光取名叫无心 2020-12-14 08:54

Is there a way to suppress duplicated messages on a queue defined on ActiveMQ server?

I tried to define manually JMSMessageID, (message.setJMSMessageID(\"uniqueid\")

5条回答
  •  既然无缘
    2020-12-14 09:10

    There is a way to make ActiveMQ to filter duplicates based on a JMS property. it involves writing an Activemq Plugin. A basic broker filter that sends duplicate messages to the deadletter queue would be like this

    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);
                } 
            }
        }  
    }
    

提交回复
热议问题