0

I am trying implement sample retry mechanism for RabbitMQ using Spring's StatefulRetryOperationsInterceptor.

As stated in documentation, I need to setup message key generator as the message id is absent. What I don't understand is the real usage of unique id generated per message. i.e. when I used below implementation I did not have any issue with retry:

StatefulRetryOperationsInterceptor interceptor = 
RetryInterceptorBuilder.stateful()
           .maxAttempts(3)
           .backOffOptions(2000, 1, 2000)
           .messageKeyGenerator(
            new MessageKeyGenerator() {
              @Override
              public Object getKey(Message message) {
                return 1;
              }
           );
container.setAdviceChain(new Advice[] {interceptor});
4

1 に答える 1

1

ステートフルな再試行では、元のメッセージが何らかの形で一意である必要があります。そのため、メッセージの再試行の「状態」を判断できます。最も簡単な方法は、メッセージ発行者に一意のメッセージ ID ヘッダーを追加させることです。

ただし、メッセージを一意に識別するために、メッセージ本文またはその他のヘッダーの何かが使用される可能性があります。MessageKeyGenerator一意の ID を決定するために使用される を入力します。

すべてのメッセージが同じメッセージ キーを持ち、(再試行の観点から) 同じメッセージの配信と見なされるため、定数 (この場合は 1) を使用しても機能しません。

フレームワークはMissingMessageIdAdvice、ステートフルな再試行の限定的なサポートを提供できる を提供します (再試行アドバイスの前にアドバイス チェーンに追加された場合)。受信メッセージに messageId を追加します。

「制限付き」は、ステートフルな再試行の完全なサポートが利用できないことを意味します。再配信の試行は 1 回のみ許可されます。

再配信が失敗した場合、メッセージは拒否され、その結果、メッセージは破棄されるか、DLX/DLQ (構成されている場合) にルーティングされます。いずれの場合も、「一時的な」状態はキャッシュから削除されます。

一般に、再試行の完全なサポートが必要で、messageIdプロパティがなく、一意のキーを生成する方法がない場合は、MessageKeyGeneratorステートレスな再試行を使用することをお勧めします。

于 2016-04-18T03:36:03.280 に答える