最新の安定バージョンについては、spring-cloud-stream 4.2.1 を使用してください。

RabbitMQ バインダーで再試行する

バインダー内で再試行が有効になっている場合、リスナーコンテナースレッドは、構成されているバックオフ期間の間中断されます。これは、単一のコンシューマーで厳密なオーダーが必要な場合に重要になる可能性があります。ただし、他のユースケースでは、他のメッセージがそのスレッドで処理されるのを防ぎます。バインダーの再試行を使用する代わりに、デッドレターキュー(DLQ)に存続する時間のあるデッドレタリングと、DLQ 自体のデッドレター構成を設定することもできます。ここで説明するプロパティの詳細については、"RabbitMQ バインダーのプロパティ" を参照してください。次の設定例を使用して、この機能を有効にできます。

  • autoBindDlq を true に設定します。バインダーは DLQ を作成します。オプションで、deadLetterQueueName で名前を指定できます。

  • dlqTtl を、再配信の間に待機するバックオフ時間に設定します。

  • dlqDeadLetterExchange をデフォルトの交換に設定します。デフォルトの deadLetterRoutingKey はキュー名(destination.group)であるため、DLQ からの期限切れのメッセージは元のキューにルーティングされます。次の例に示すように、デフォルトの交換に設定するには、値を指定せずにプロパティを設定します。

メッセージを強制的にデッドレターにするには、AmqpRejectAndDontRequeueException をスローするか、requeueRejected を false (デフォルト)に設定して例外をスローします。

ループは終わりなく続きます。これは一時的な問題には問題ありませんが、何度か試行した後はあきらめたい場合があります。幸い、RabbitMQ は x-death ヘッダーを提供します。これにより、発生したサイクル数を判別できます。

諦めた後にメッセージを確認するには、ImmediateAcknowledgeAmqpException をスローします。