为端点添加行为

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

例如,考虑以下流程:

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

如果你在轮询器的增强链中配置了一些重试逻辑,并且对 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 之后进行的进一步下游操作。 增强的范围仅限于端点本身。

目前,你无法增强整个端点 <chain/>。 架构不允许将 <request-handler-advice-chain> 作为链本身的子元素。 但是,<request-handler-advice-chain> 可以添加到 <chain> 元素中生成回复的单个端点。 一个例外是,在不生成回复的链中,由于链中的最后一个元素是 outbound-channel-adapter,因此无法增强该最后一个元素。 如果你需要增强此类元素,则必须将其移出链外(链的 output-channel 成为适配器的 input-channel)。 然后可以像往常一样增强适配器。 对于生成回复的链,每个子元素都可以增强。