Is there a way to suppress duplicated messages on a queue defined on ActiveMQ server?
I tried to define manually JMSMessageID, (message.setJMSMessageID(\"uniqueid\")
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);
}
}
}
}