3

Active MQ を使用してメッセージをオーバーライドする遅延キューを実装しようとしています。

各メッセージは x (たとえば 60 秒) の遅延で配信されるようにスケジュールされています。

その間に同じメッセージが再度受信された場合、前のメッセージを上書きする必要があります。

したがって、10 個のメッセージを受信したとしても、x 秒で言うことができます。1 つのメッセージのみを処理する必要があります。

これを達成するためのきれいな方法はありますか?

4

4 に答える 4

6

この質問には、個別に対処する必要がある 2 つの部分があります。

ActiveMQ でメッセージを遅らせることはできますか?

はい。 「メッセージ配信の遅延とスケジュール」を参照してください。<broker ... schedulerSupport="true">ActiveMQ 構成で設定するだけでなくAMQ_SCHEDULED_DELAY、メッセージを遅延させる時間 (この場合は 10000) を示す JMS メッセージのプロパティを設定する必要があります。

同じメッセージが複数回消費されるのを防ぐ方法はありますか?

はい。ただし、これは ActiveMQ の問題ではなく、アプリケーションの問題です。これは、重複除外またはべき等消費と呼ばれることがよくあります。コンシューマーが 1 つしかない場合の最も簡単な方法は、受信したメッセージをマップで追跡し、そのマップでメッセージを受信したかどうかを確認することです。見られた場合は破棄してください。

異なるマシンに複数のコンシューマーがある場合や、その状態をアプリケーションの再起動後も維持したい場合など、より複雑なユース ケースでは、データベースに表示されるメッセージのテーブルを保持し、毎回クエリを実行する必要があります。

人々があなたを助けることを奨励するので、それが役立つ場合は、この回答に投票してください。

于 2013-07-25T11:47:45.140 に答える
0

また、ActiveMQ BrokerService クラスのメソッドに従って、スケジューラ機能を使用できるように永続性を構成する必要があります。

public boolean isSchedulerSupport() {
    return this.schedulerSupport && (isPersistent() || jobSchedulerStore != null);
}
于 2014-11-25T10:33:39.763 に答える