6

異なるプロセス間でリクエストを渡すために activemq を使用しています。場合によっては、キューに複数の重複したメッセージ (リクエスト) があります。1つだけ持っていたいです。古いメッセージを同様の属性に置き換える方法でメッセージを送信する方法はありますか? 存在しない場合、キューを調べて特定の属性を持つメッセージを確認する方法はありますか (この場合、古いメッセージが存在する場合は新しいメッセージを送信しません)。

明確化 (Dave の回答に基づく): 実際には、消費者がメッセージを受け取るたびに発生する処理の量を減らすために、キューに重複したメッセージがないことを確認しようとしています。したがって、メッセージを置き換えるか、キューに入れないようにしたいと思います。

ありがとう。

4

2 に答える 2

3

これは、キューまたはトピックから重複を削除するIdempotent Consumerの理想的な使用例のように思えます。

次の例は、エンタープライズ統合パターンのいずれかを実装する最も簡単な方法であるApache Camelでこれを行う方法を示しています。特に、 Camelがすぐに統合されたActiveMQを使用している場合

from("activemq:queueA").
  idempotentConsumer(memoryMessageIdRepository(200)).
  header("myHeader").
  to("activemq:queueB");

これに対する唯一の秘訣は、各メッセージで一意の ID 式を計算する簡単な方法があることを確認することです。たとえば、ドキュメントから XPath を引き出すか、上記の例のように一意のメッセージ ヘッダーを使用します。

于 2008-10-27T08:11:35.170 に答える
1

キューを参照し、セレクターを使用してメッセージを識別できます。ただし、少量のメッセージがない限り、これはうまくスケーリングしません。代わりに、メッセージは、データベース レコード (またはレコードのセット) へのポインターである必要があります。そうすれば、レコードを更新でき、メッセージを受け取った人は誰でもレコードの最新バージョンにアクセスできます。

于 2008-10-24T19:09:20.423 に答える