跳到主要内容

处理消息建议

QWen Plus 中英对照 Handling Message Advice

本节的介绍 所述,请求处理程序建议链中的建议对象仅应用于当前端点,而不应用于下游流程(如果有的话)。对于生成回复的 MessageHandler 对象(例如那些扩展 AbstractReplyProducingMessageHandler 的对象),建议应用于内部方法:handleRequestMessage()(由 MessageHandler.handleMessage() 调用)。对于其他消息处理程序,建议应用于 MessageHandler.handleMessage()

在某些情况下,即使消息处理程序是 AbstractReplyProducingMessageHandler,建议也必须应用于 handleMessage 方法。例如,幂等接收器 可能会返回 null,如果处理程序的 replyRequired 属性设置为 true,这将导致异常。另一个例子是 BoundRabbitChannelAdvice —— 请参阅 严格的消息顺序

从 4.3.1 版本开始,引入了一个新的 HandleMessageAdvice 接口及其基础实现 (AbstractHandleMessageAdvice)。实现 HandleMessageAdviceAdvice 对象总是应用于 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>
xml

在前面的例子中,<tx:advice> 被应用到 AbstractReplyProducingMessageHandler.handleRequestMessage()。然而,myHandleMessageAdvice 被应用到 MessageHandler.handleMessage()。因此,它是在 <tx:advice> 之前 被调用的。为了保持顺序,你应该遵循标准的 Spring AOP 配置方法,并使用带有 .handler 后缀的端点 id 来获取目标 MessageHandler bean。请注意,在这种情况下,整个下游流程都在事务范围内。

MessageHandler 不返回响应的情况下,建议链顺序得以保留。

从 5.3 版本开始,提供了 HandleMessageAdviceAdapter 以应用于 MessageHandler.handleMessage() 方法的任何 MethodInterceptor,因此适用于整个子流程。例如,可以将 RetryOperationsInterceptor 应用于从某些端点开始的整个子流程;默认情况下这是不可能的,因为消费者端点仅将建议应用于 AbstractReplyProducingMessageHandler.RequestHandler.handleRequestMessage()