Active MQ を使用してメッセージをオーバーライドする遅延キューを実装しようとしています。
各メッセージは x (たとえば 60 秒) の遅延で配信されるようにスケジュールされています。
その間に同じメッセージが再度受信された場合、前のメッセージを上書きする必要があります。
したがって、10 個のメッセージを受信したとしても、x 秒で言うことができます。1 つのメッセージのみを処理する必要があります。
これを達成するためのきれいな方法はありますか?
Active MQ を使用してメッセージをオーバーライドする遅延キューを実装しようとしています。
各メッセージは x (たとえば 60 秒) の遅延で配信されるようにスケジュールされています。
その間に同じメッセージが再度受信された場合、前のメッセージを上書きする必要があります。
したがって、10 個のメッセージを受信したとしても、x 秒で言うことができます。1 つのメッセージのみを処理する必要があります。
これを達成するためのきれいな方法はありますか?
この質問には、個別に対処する必要がある 2 つの部分があります。
ActiveMQ でメッセージを遅らせることはできますか?
はい。 「メッセージ配信の遅延とスケジュール」を参照してください。<broker ... schedulerSupport="true">
ActiveMQ 構成で設定するだけでなくAMQ_SCHEDULED_DELAY
、メッセージを遅延させる時間 (この場合は 10000) を示す JMS メッセージのプロパティを設定する必要があります。
同じメッセージが複数回消費されるのを防ぐ方法はありますか?
はい。ただし、これは ActiveMQ の問題ではなく、アプリケーションの問題です。これは、重複除外またはべき等消費と呼ばれることがよくあります。コンシューマーが 1 つしかない場合の最も簡単な方法は、受信したメッセージをマップで追跡し、そのマップでメッセージを受信したかどうかを確認することです。見られた場合は破棄してください。
異なるマシンに複数のコンシューマーがある場合や、その状態をアプリケーションの再起動後も維持したい場合など、より複雑なユース ケースでは、データベースに表示されるメッセージのテーブルを保持し、毎回クエリを実行する必要があります。
人々があなたを助けることを奨励するので、それが役立つ場合は、この回答に投票してください。
また、ActiveMQ BrokerService クラスのメソッドに従って、スケジューラ機能を使用できるように永続性を構成する必要があります。
public boolean isSchedulerSupport() {
return this.schedulerSupport && (isPersistent() || jobSchedulerStore != null);
}