非同步 @RabbitListener 返回型別

@RabbitListener(和 @RabbitHandler)方法可以指定非同步返回型別 CompletableFuture<?>Mono<?>,從而允許非同步傳送回覆。ListenableFuture<?> 已不再支援,它已被 Spring Framework 棄用。

監聽器容器工廠必須配置 AcknowledgeMode.MANUAL,以便消費者執行緒不會確認(ack)訊息;相反,非同步完成將在非同步操作完成後確認或否定確認(nack)訊息。當非同步結果完成時出現錯誤,訊息是否重新入隊取決於丟擲的異常型別、容器配置以及容器錯誤處理器。預設情況下,訊息將被重新入隊,除非容器的 defaultRequeueRejected 屬性設定為 false(預設為 true)。如果非同步結果完成時出現 AmqpRejectAndDontRequeueException,訊息將不會被重新入隊。如果容器的 defaultRequeueRejected 屬性為 false,您可以透過將 Future 的異常設定為 ImmediateRequeueException 來覆蓋預設行為,訊息將被重新入隊。如果在監聽器方法內發生阻止建立非同步結果物件的異常,您必須捕獲該異常並返回一個適當的返回物件,該物件將導致訊息被確認或重新入隊。

從版本 2.2.21、2.3.13、2.4.1 開始,當檢測到非同步返回型別時,AcknowledgeMode 將自動設定為 MANUAL。此外,對於帶有致命異常的入站訊息,將單獨進行否定確認,而在此之前,任何先前的未確認訊息也會被否定確認。

從版本 3.0.5 開始,@RabbitListener(和 @RabbitHandler)方法可以使用 Kotlin suspend 標記,並且整個處理過程和回覆生成(可選)會在相應的 Kotlin 協程上進行。所有關於 AcknowledgeMode.MANUAL 的規則仍然適用。類路徑中必須存在 org.jetbrains.kotlinx:kotlinx-coroutines-reactor 依賴,以允許 suspend 函式呼叫。

同樣從版本 3.0.5 開始,如果為具有非同步返回型別(包括 Kotlin suspend 函式)的監聽器配置了 RabbitListenerErrorHandler,則在失敗後會呼叫錯誤處理器。有關此錯誤處理器及其用途的更多資訊,請參閱 異常處理