为端点添加行为
在 Spring Integration 2.2 之前,你可以通过向轮询器的 <advice-chain/>
元素添加 AOP 增强来为整个集成流添加行为。
但是,假设你只想重试,例如,一个 REST Web Service 调用,而不是任何下游端点。
例如,考虑以下流程:
inbound-adapter->poller->http-gateway1->http-gateway2->jdbc-outbound-adapter
如果你在轮询器的增强链中配置了一些重试逻辑,并且对 http-gateway2
的调用由于网络故障而失败,那么重试会导致 http-gateway1
和 http-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
)。
然后可以像往常一样增强适配器。
对于生成回复的链,每个子元素都可以增强。