处理消息 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
来为MessageHandler.handleMessage()
方法应用任何MethodInterceptor
,因此,整个子流程。例如,可以将RetryOperationsInterceptor
应用于从某个端点开始的整个子流程;默认情况下,这不可能,因为使用者端点仅将建议应用于AbstractReplyProducingMessageHandler.RequestHandler.handleRequestMessage()
。