非同步 @RabbitListener
返回類型
可以使用非同步返回類型 CompletableFuture<?>
和 Mono<?>
來指定 @RabbitListener
(和 @RabbitHandler
) 方法,以便非同步傳送回覆。ListenableFuture<?>
已不再支援;它已被 Spring Framework 棄用。
監聽器容器工廠必須配置 AcknowledgeMode.MANUAL ,以便消費者執行緒不會確認訊息;而是當非同步操作完成時,非同步完成將確認或否定確認訊息。當非同步結果完成時發生錯誤,訊息是否重新排隊取決於拋出的例外類型、容器配置和容器錯誤處理器。預設情況下,訊息將重新排隊,除非容器的 defaultRequeueRejected 屬性設定為 false (預設為 true )。如果非同步結果以 AmqpRejectAndDontRequeueException 完成,則訊息將不會重新排隊。如果容器的 defaultRequeueRejected 屬性為 false ,您可以將 future 的例外設定為 ImmediateRequeueException 來覆寫該設定,訊息將會重新排隊。如果在監聽器方法中發生某些例外狀況,導致無法建立非同步結果物件,您必須捕獲該例外狀況並傳回適當的返回物件,這將導致訊息被確認或重新排隊。 |
從 2.2.21、2.3.13、2.4.1 版本開始,當偵測到非同步返回類型時,AcknowledgeMode
將自動設定為 MANUAL
。此外,具有嚴重例外狀況的傳入訊息將被個別否定確認,先前任何先前的未確認訊息也會被否定確認。
從 3.0.5 版本開始,可以使用 Kotlin suspend
標記 @RabbitListener
(和 @RabbitHandler
) 方法,並且整個處理過程和回覆產生 (可選) 都會在各自的 Kotlin 協程上發生。所有關於 AcknowledgeMode.MANUAL
的上述規則仍然適用。org.jetbrains.kotlinx:kotlinx-coroutines-reactor
相依性必須存在於類別路徑中,以允許 suspend
函數調用。
同樣從 3.0.5 版本開始,如果在具有非同步返回類型 (包括 Kotlin suspend 函數) 的監聽器上配置了 RabbitListenerErrorHandler
,則在失敗後會調用錯誤處理器。請參閱 處理例外 以取得有關此錯誤處理器及其用途的更多資訊。