跳到主要内容
版本:7.0.2

为端点添加行为

DeepSeek V3 中英对照 Adding Behavior to Endpoints

在 Spring Integration 2.2 之前,你可以通过向轮询器的 <advice-chain/> 元素添加 AOP 通知来为整个集成流添加行为。然而,假设你只想重试某个 REST Web 服务调用,而不涉及任何下游端点。

例如,考虑以下流程:

inbound-adapter->poller->http-gateway1->http-gateway2->jdbc-outbound-adapter

如果你在轮询器(poller)的advice链中配置了重试逻辑,并且由于网络故障导致对http-gateway2的调用失败,重试机制会导致http-gateway1http-gateway2都被第二次调用。类似地,当jdbc-outbound-adapter发生瞬时故障后,两个HTTP网关会先被再次调用,然后才重新调用jdbc-outbound-adapter

Spring Integration 2.2 新增了为单个端点添加行为的功能。这是通过在许多端点中添加 <request-handler-advice-chain/> 元素来实现的。以下示例展示了如何在 outbound-gateway 中使用 <request-handler-advice-chain/> 元素:

<int-http:outbound-gateway id="withAdvice"
url-expression="'http://localhost/test1'"
request-channel="requests"
reply-channel="nextChannel">
<int-http:request-handler-advice-chain>
<ref bean="myRetryAdvice" />
</int-http:request-handler-advice-chain>
</int-http:outbound-gateway>

在这种情况下,myRetryAdvice 仅应用于此网关的本地范围,不会在回复发送到 nextChannel 后对下游的进一步操作生效。该通知的作用范围仅限于端点本身。

important

目前,您无法为整个 <chain/> 端点配置建议链。该模式不允许 <request-handler-advice-chain> 作为链本身的子元素。

但是,可以在 <chain> 元素内为各个产生回复的端点添加 <request-handler-advice-chain>。一个例外是,在链中不产生回复的情况下,由于链的最后一个元素是 outbound-channel-adapter,该最后一个元素无法被建议。如果您需要为此类元素配置建议链,必须将其移出链外(链的 output-channel 作为适配器的 input-channel)。然后,适配器可以像往常一样被建议。对于产生回复的链,每个子元素都可以被建议。

章节总结

📄️ Reactive Advice

从版本5.3开始,ReactiveRequestHandlerAdvice可用于处理生成Mono回复的请求消息处理器。为此,必须提供一个BiFunction\<Message, Publisher\<?>>,该函数会通过Mono.transform()操作符在拦截的handleRequestMessage()方法实现生成的回复中被调用。通常,当我们希望通过timeout()、retry()等支持操作符来控制网络波动时,这种Mono定制是必要的。例如,当我们通过WebFlux客户端发起HTTP请求时,可以使用以下配置来确保等待响应的时间不超过5秒:

📄️ 上下文持有者建议

从版本6.1开始,我们引入了 ContextHolderRequestHandlerAdvice。这个通知会从请求消息中提取某些值,并将其存储在上下文持有器中。当目标 MessageHandler 上的执行完成时,该值会从上下文中清除。理解这个通知的最佳方式类似于编程流程:我们将某个值存储到 ThreadLocal 中,从目标调用中访问它,然后在执行后清理 ThreadLocal。ContextHolderRequestHandlerAdvice 需要以下构造函数参数:一个 Function\<Message\<?>, Object> 作为值提供者,一个 Consumer 作为上下文设置回调,以及一个 Runnable 作为上下文清理钩子。