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