Spring Integration 2.2 新特性 (第 4 部分 - 重试及更多)

工程 | Gary Russell | 2012 年 10 月 9 日 | ...

引言

这是系列博客文章的第四部分,重点介绍 Spring Integration 2.2 中的一些新特性,该版本紧随最近发布的Release Candidate 1之后。 第一部分介绍了 MongoDB 适配器,第二部分介绍了事务同步;第三部分介绍了 JPA 支持。

Spring Integration 2.2 引入了向消息处理器应用一个或多个局部 AOP Advice(通知)元素的能力。还提供了一些标准的 Advice 类以及一个探索这些特性功能的示例应用。

背景

有关面向切面编程 (AOP) 的一般介绍,请参阅Spring 文档

到目前为止,在使用 Spring Integration 时,可以将 <advice-chain/> 应用于轮询器。假设使用 Direct 通道,链中的 AOP Advice 应用于整个流,包含所有下游组件。然而,有时仅对单个端点应用通知会更有利,例如重试操作,而不是当远下游的某个组件失败时导致整个流失败并被重试。

引言

Spring Integration 2.2 在许多端点上引入了一个新的子元素 <request-handler-advice-chain/>

考虑一个 Spring Integration 流

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

如果数据库连接出现故障,并且我们在轮询器上设置了重试通知;整个流将被重新处理;导致两个 http 网关都被二次(或多次)调用。

此特性提供了一种机制,可以(除其他外)仅对外发适配器应用重试通知。此外,该通知可以应用于许多其他端点,无论它们在流中出现的位置如何,例如,如果 http-gateway2 失败,我们可以仅重试它。

除了配置 Advice 链的通用能力之外,还提供了三个 Advice 类:

    RequestHandlerRetryAdvice RequestHandlerCircuitBreakerAdvice ExpressionEvaluatingRequestHandlerAdvice

这些在下面有更详细的描述,并在新的 retry-and-more 示例应用中进行了进一步探索。

RequestHandlerRetryAdvice

此通知提供了配置重试的能力,利用了起源于 Spring Batch 的 spring-retry 项目。spring-retry 有一个 RetryTemplate,允许配置重试策略,例如回退(back-off)、恢复操作等。有关更多信息,请参阅 spring-retry 项目

重试可以是无状态的或有状态的。无状态重试意味着重试仅在内部执行;发生故障时,线程仅根据重试和回退策略进行重试。有状态恢复用于消息源本身可以重试的情况——例如事务性的 JMS 或 AMQP 入站通道适配器。在这种情况下,需要识别该消息是否之前已被尝试过(例如 JMSMessageID)。为此,提供了基于 SpEL 的 RetryStateGenerator,例如可以从头部提取标识符。

在这两种情况下,当重试次数用尽时,可以调用 RecoveryCallback;这用于处理失败的消息。提供了一个 ErrorMessageSendingRecoverer,它将失败的消息发送到一个通道。

RequestHandlerRetryAdvice 的示例在新发布的 retry-and-more 示例应用中有所展示。

RequestHandlerCircuitBreakerAdvice

此通知提供了断路器模式(Circuit Breaker pattern)的实现。例如,如果远程服务不可用(请求失败达到可配置的次数),此通知会在一段(可配置的)时间内阻止再次调用该服务。一旦该时间到期,通知将允许下一次尝试调用服务,但是,如果服务仍然不可用,它会立即被标记为不可用。当服务不可用时,会立即抛出异常而无需调用服务;此时断路器被称为处于“开启”(open)状态。一旦服务调用成功,断路器就会“关闭”(closed),并且所有后续调用都将路由到该服务,直到再次检测到服务不可用,因为连续失败尝试的次数超过了配置的阈值。

RequestHandlerCircuitBreakerAdvice 的示例在新发布的 retry-and-more 示例应用中有所展示。

ExpressionEvaluatingRequestHandlerAdvice

此通知提供了一种机制,在请求处理后(无论成功还是失败)会评估一个 SpEL 表达式。例如,对于 FTP 出站适配器,onSuccessExpression 可能如下所示:

"payload.reNameTo('/foo/succeeded/" + payload.name)",

而 onFailureExpression 可能如下所示:

"payload.reNameTo('/foo/failed/" + payload.name)".

每个表达式都有一个相应的通道,评估结果(如果有的话)将发送到该通道。

此通知的示例也在新发布的 retry-and-more 示例应用中有所展示。

自定义 Advice 类

虽然可以应用任何 AOP Advice,但提供了一个抽象类来协助创建专门用于通知端点的 Advice 类。有关更多信息,请参阅参考文档中的自定义 Advice 类部分。

结论

Spring Integration 提供了极大的灵活性,可将松散耦合的组件组装到应用中。现在,将重试等常见机制应用于应用中的单个组件变得极其容易。有关更多信息,请参阅参考文档retry-and-more 示例应用。

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您快速提升。

了解更多

获取支持

Tanzu Spring 通过单一订阅即可获得 OpenJDK™、Spring 和 Apache Tomcat® 的支持及二进制文件。

了解更多

近期活动

查看 Spring 社区的所有近期活动。

查看全部