处理消息通知
如本节简介中所述,请求处理程序 advice 链中的 advice 对象仅应用于当前端点,而不是下游流(如果有)。
为MessageHandler
生成 Reply 的对象(例如,扩展AbstractReplyProducingMessageHandler
),该建议将应用于内部方法:handleRequestMessage()
(调用 自MessageHandler.handleMessage()
).
对于其他消息处理程序,该建议将应用于MessageHandler.handleMessage()
.
在某些情况下,即使消息处理程序是AbstractReplyProducingMessageHandler
,则建议必须应用于handleMessage
方法。
例如,幂等接收器可能会返回null
,如果处理程序的replyRequired
属性设置为true
.
另一个示例是BoundRabbitChannelAdvice
— 请参阅 严格消息排序。
从版本 4.3.1 开始,新的HandleMessageAdvice
interface 及其基本实现 (AbstractHandleMessageAdvice
) 已引入。Advice
实现HandleMessageAdvice
始终应用于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
suffix 获取目标MessageHandler
豆。
请注意,在这种情况下,整个下游流都在事务范围内。
对于MessageHandler
这不会返回响应,则保留 Advice Chain 顺序。
从版本 5.3 开始,HandleMessageAdviceAdapter
用于应用任何MethodInterceptor
对于MessageHandler.handleMessage()
方法,因此,整个子流。
例如,RetryOperationsInterceptor
可以应用于从某个端点开始的整个子流;默认情况下,这是不可能的,因为 Consumer 端点仅将建议应用于AbstractReplyProducingMessageHandler.RequestHandler.handleRequestMessage()
.