处理消息 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>

在前面的示例中,<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()

© . This site is unofficial and not affiliated with VMware.