訊息建議處理

本節簡介中所述,請求處理程序建議鏈中的 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()