非同期 @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 サスペンド関数を含む) で構成されている場合、失敗後にエラーハンドラーが呼び出されます。このエラーハンドラーとその目的の詳細については、"例外の処理" を参照してください。