20

ActiveMQサーバーで定義されたキューで重複するメッセージを抑制する方法はありますか?

JMSMessageID(message.setJMSMessageID( "uniqueid"))を手動で定義しようとしましたが、サーバーはこの変更を無視し、生成されたJMSMessageIDが組み込まれたメッセージを配信します。

仕様により、メッセージの重複排除方法に関するリファレンスは見つかりませんでした。

HornetQでは、この問題に対処するために、メッセージ定義でHQ固有のプロパティ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に同様のソリューションがあるかどうか誰かが知っていますか?

4

5 に答える 5

7

Apache Camelを見る必要があります。これは、任意のJMSプロバイダーで動作するべき等のコンシューマーコンポーネントを提供します。http://camel.apache.org/idempotent-consumer.htmlを参照してください。

これをActiveMQコンポーネントと組み合わせて使用​​すると、JMSの使用が非常に簡単になります。http: //camel.apache.org/activemq.htmlを参照してください。

于 2011-02-09T11:55:14.110 に答える
5

ActiveMQがそれをネイティブにサポートしているかどうかは疑問ですが、べき等のコンシューマーを実装するのは簡単なはずです。これを行う方法は、プロデューサー側で各メッセージに一意の識別子を追加することです。ストア(db、キャッシュなど)を使用して、コンシューマー側で、メッセージが以前に受信されたかどうかを確認できます。そのチェックに基づいて処理を続行します。

同じ行に沿って以前のstackoverflowの質問が表示されます-ApacheActiveMQ5.3-重複メッセージを拒否するようにキューを構成するにはどうすればよいですか?、それも役立つかもしれません。

于 2011-02-09T00:41:31.217 に答える
4

ActiveMQトランスポートにベイクされた重複メッセージを削除するためのサポートが追加されました。構成値auditDepthおよび接続構成ガイドauditMaximumProducerNumberを参照してください。

于 2013-08-08T15:49:23.740 に答える
3

ActiveMQを作成して、JMSプロパティに基づいて重複をフィルタリングする方法があります。Activemqプラグインの作成が含まれます。重複メッセージをデッドレターキューに送信する基本的なブローカーフィルターは次のようになります

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);
            } 
        }
    }  
}
于 2012-08-27T09:34:47.147 に答える
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です。

于 2016-12-13T02:25:16.897 に答える