如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

处理消息建议

正如在本节介绍中讨论的,请求处理程序建议链中的建议对象仅应用于当前端点,而不适用于下游流程(如果有)。 对于产生回复的MessageHandler对象(例如那些扩展AbstractReplyProducingMessageHandler的对象),建议将应用于内部方法:handleRequestMessage()(从MessageHandler.handleMessage()调用)。 对于其他消息处理器,建议将应用于MessageHandler.handleMessage()spring-doc.cadn.net.cn

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

从版本 4.3.1 开始,引入了一个新的 HandleMessageAdvice 接口及其基础实现(AbstractHandleMessageAdvice)。 实现了 HandleMessageAdviceAdvice 对象始终应用于 handleMessage() 方法,无论处理器类型如何。spring-doc.cadn.net.cn

重要的是要理解,HandleMessageAdvice 实现(例如 幂等接收器),在应用于返回响应的处理器时,与 adviceChain 是分离的,并正确地应用于 MessageHandler.handleMessage() 方法。spring-doc.cadn.net.cn

由于这种分离,建议链的顺序未被遵守。

考虑以下配置:spring-doc.cadn.net.cn

<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。 请注意,在这种情况下,整个下游流程都在事务范围内。spring-doc.cadn.net.cn

如果 MessageHandler 未返回响应,则保留建议链的顺序。spring-doc.cadn.net.cn

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