跳到主要内容

为端点添加行为

QWen Plus 中英对照 Adding Behavior to Endpoints

在 Spring Integration 2.2 之前,您可以通过向轮询器的 <advice-chain/> 元素添加 AOP 建议来为整个集成流添加行为。但是,假设您只想重试,比如说,仅重试 REST Web 服务调用,而不重试任何下游端点。

例如,考虑以下流程:

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

如果你在轮询器的建议链中配置了一些重试逻辑,且调用 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>
xml

在这种情况下,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\<?>, Mono\<?>, Publisher\<?>>,它会在拦截的 handleRequestMessage() 方法实现所生成的回复上调用 Mono.transform() 操作符时被调用。通常,当我们要通过 timeout()、retry() 等支持操作符来控制网络波动时,这种 Mono 定制是必要的。例如,当我们通过 WebFlux 客户端发起 HTTP 请求时,我们可以使用以下配置,以确保等待响应的时间不超过 5 秒:

📄️ 上下文持有者建议

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