訊息 Advice 處理

正如本節導言中所討論的,請求處理器 advice 鏈中的 advice 物件僅應用於當前端點,而不應用於下游流(如果有的話)。對於產生回覆的 MessageHandler 物件(例如那些擴充套件 AbstractReplyProducingMessageHandler 的物件),advice 應用於內部方法:handleRequestMessage()(由 MessageHandler.handleMessage() 呼叫)。對於其他訊息處理器,advice 應用於 MessageHandler.handleMessage()

在某些情況下,即使訊息處理器是 AbstractReplyProducingMessageHandler,advice 也必須應用於 handleMessage 方法。例如,冪等接收器可能返回 null,如果處理器的 replyRequired 屬性設定為 true,這將導致異常。另一個例子是 BoundRabbitChannelAdvice — 請參閱嚴格訊息排序

從版本 4.3.1 開始,引入了新的 HandleMessageAdvice 介面及其基礎實現(AbstractHandleMessageAdvice)。實現 HandleMessageAdviceAdvice 物件始終應用於 handleMessage() 方法,無論處理程式型別如何。

理解 HandleMessageAdvice 實現(例如冪等接收器)應用於返回響應的處理程式時,會與 adviceChain 分離並正確應用於 MessageHandler.handleMessage() 方法,這一點很重要。

由於這種分離,advice 鏈順序將不會得到遵循。

考慮以下配置

<some-reply-producing-endpoint ... >
    <int:request-handler-advice-chain>
        <tx:advice ... />
        <ref bean="myHandleMessageAdvice" />
    </int:request-handler-advice-chain>
</some-reply-producing-endpoint>

在前面的示例中,<tx:advice> 應用於 AbstractReplyProducingMessageHandler.handleRequestMessage()。但是,myHandleMessageAdvice 應用於 MessageHandler.handleMessage()。因此,它在 <tx:advice> 之前被呼叫。為了保留順序,您應該遵循標準的Spring AOP配置方法,並使用端點 id.handler 字尾來獲取目標 MessageHandler bean。請注意,在這種情況下,整個下游流都處於事務範圍內。

對於不返回響應的 MessageHandler,advice 鏈順序得到保留。

從版本 5.3 開始,提供了 HandleMessageAdviceAdapter,用於將任何 MethodInterceptor 應用於 MessageHandler.handleMessage() 方法,從而應用於整個子流。例如,可以將 RetryOperationsInterceptor 應用於從某個端點開始的整個子流;預設情況下這是不可能的,因為消費者端點僅將 advice 應用於 AbstractReplyProducingMessageHandler.RequestHandler.handleRequestMessage()