非同期 @RabbitListener 戻り型

@RabbitListener (および @RabbitHandler) メソッドは、非同期戻り型 CompletableFuture<?> および Mono<?> で指定でき、応答を非同期で送信できます。ListenableFuture<?> はサポートされなくなりました。Spring Framework によって廃止されました。

コンシューマースレッドがメッセージを確認しないように、リスナーコンテナーファクトリは AcknowledgeMode.MANUAL で構成する必要があります。代わりに、非同期補完は、非同期操作の補完時にメッセージを確認または拒否します。非同期の結果がエラーで完了した場合、メッセージが再度キューに入れられるかどうかは、スローされる例外の種類、コンテナーの構成、コンテナーのエラーハンドラーによって異なります。デフォルトでは、コンテナーの defaultRequeueRejected プロパティが false に設定されていない限り (デフォルトでは true です)、メッセージは再度キューに入れられます。非同期の結果が AmqpRejectAndDontRequeueException で完了した場合、メッセージは再キューイングされません。コンテナーの defaultRequeueRejected プロパティが false の場合、フューチャーの例外を ImmediateRequeueException に設定することでそれをオーバーライドでき、メッセージは再キューイングされます。非同期結果オブジェクトの作成を妨げる何らかの例外がリスナーメソッド内で発生した場合、その例外をキャッチし、メッセージを確認または再キューイングする適切な戻りオブジェクトを返す必要があります。

バージョン 2.2.21、2.3.13、2.4.1 以降では、非同期の戻り値の型が検出されると、AcknowledgeMode は自動的に MANUAL に設定されます。さらに、致命的な例外を含む受信メッセージは個別に否定応答されます。以前は、以前の未応答メッセージも否定応答されていました。

バージョン 3.0.5 以降、@RabbitListener (および @RabbitHandler) メソッドは Kotlin suspend でマークでき、処理プロセス全体と応答生成 (オプション) はそれぞれの Kotlin コルーチンで発生します。AcknowledgeMode.MANUAL に関する前述のルールはすべて引き続き適用されます。suspend 関数の呼び出しを許可するには、クラスパスに org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依存関係が存在する必要があります。

また、バージョン 3.0.5 以降では、リスナー上で RabbitListenerErrorHandler が非同期戻り型 (Kotlin サスペンド関数を含む) で構成されている場合、失敗後にエラーハンドラーが呼び出されます。このエラーハンドラーとその目的の詳細については、"例外の処理" を参照してください。