處理訊息 Advice
如本節介紹中所述,請求處理程式建議鏈中的建議物件僅應用於當前端點,而不應用於下游流(如果有)。對於生成回覆的MessageHandler物件(例如那些擴充套件AbstractReplyProducingMessageHandler的物件),建議應用於內部方法:handleRequestMessage()(從MessageHandler.handleMessage()呼叫)。對於其他訊息處理程式,建議應用於MessageHandler.handleMessage()。
在某些情況下,即使訊息處理程式是AbstractReplyProducingMessageHandler,建議也必須應用於handleMessage方法。例如,冪等接收器可能會返回null,如果處理程式的replyRequired屬性設定為true,這將導致異常。另一個例子是BoundRabbitChannelAdvice——請參見嚴格訊息排序。
從版本 4.3.1 開始,引入了一個新的HandleMessageAdvice介面及其基本實現(AbstractHandleMessageAdvice)。實現HandleMessageAdvice的Advice物件始終應用於handleMessage()方法,而不管處理程式型別如何。
重要的是要理解,HandleMessageAdvice實現(例如冪等接收器),當應用於返回響應的處理程式時,會從adviceChain中分離出來,並正確應用於MessageHandler.handleMessage()方法。
| 由於這種分離,建議鏈的順序不會被遵守。 |
考慮以下配置
<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的情況下,建議鏈的順序保持不變。
從版本 5.3 開始,提供了HandleMessageAdviceAdapter來將任何MethodInterceptor應用於MessageHandler.handleMessage()方法,從而應用於整個子流。例如,RetryOperationsInterceptor可以應用於從某個端點開始的整個子流;預設情況下這是不可能的,因為消費者端點僅將建議應用於AbstractReplyProducingMessageHandler.RequestHandler.handleRequestMessage()。