訊息 Advice 處理
正如本節導言中所討論的,請求處理器 advice 鏈中的 advice 物件僅應用於當前端點,而不應用於下游流(如果有的話)。對於產生回覆的 MessageHandler
物件(例如那些擴充套件 AbstractReplyProducingMessageHandler
的物件),advice 應用於內部方法:handleRequestMessage()
(由 MessageHandler.handleMessage()
呼叫)。對於其他訊息處理器,advice 應用於 MessageHandler.handleMessage()
。
在某些情況下,即使訊息處理器是 AbstractReplyProducingMessageHandler
,advice 也必須應用於 handleMessage
方法。例如,冪等接收器可能返回 null
,如果處理器的 replyRequired
屬性設定為 true
,這將導致異常。另一個例子是 BoundRabbitChannelAdvice
— 請參閱嚴格訊息排序。
從版本 4.3.1 開始,引入了新的 HandleMessageAdvice
介面及其基礎實現(AbstractHandleMessageAdvice
)。實現 HandleMessageAdvice
的 Advice
物件始終應用於 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()
。