非同步 @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
,則在失敗後會呼叫錯誤處理器。有關此錯誤處理器及其用途的更多資訊,請參閱 異常處理。