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

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

简介

这是博文系列的第四部分,重点介绍了 Spring Integration 2.2 中的一些新特性,这些特性是在最近发布的 候选版本 1 之后提供的。 第一部分 讨论了 MongoDB 适配器, 第二部分 讨论了事务同步; 第三部分 讨论了 JPA 支持。

Spring Integration 2.2 引入了将一个或多个本地化 AOP Advice 元素应用于消息处理程序的功能。还提供了一些标准的 Advice 类,以及一个探索其提供的功能的示例应用程序。

背景

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

到目前为止,在 Spring Integration 中,可以将<advice-chain/>应用于轮询器。假设正在使用直接通道,则此类链中的 AOP Advice 应用于整个流程,包含所有下游组件。但是,有时仅建议单个端点(例如重试操作)会更有优势,而不是在下游组件失败时导致整个流程失败并重试。

简介

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

考虑一个 Spring Integration 流程

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

如果数据库连接出现故障,并且轮询器上存在重试建议;整个流程将被重新处理;导致两个 HTTP 网关都被调用第二次(或更多次)。

此功能提供了一种机制,可以将重试建议(以及其他建议)仅应用于出站适配器。此外,可以将 Advice 应用于许多其他端点,无论它们在流程中的哪个位置出现,例如,如果 HTTP-gateway2 失败,我们可以重试它。

除了配置 Advice 链的一般功能外,还提供了三个 Advice 类:

    RequestHandlerRetryAdvice、RequestHandlerCircuitBreakerAdvice、ExpressionEvaluatingRequestHandlerAdvice

下面将更详细地描述这些内容,并在新的 retry-and-more 示例应用程序中进一步探讨。

RequestHandlerRetryAdvice

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

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

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

新的 retry-and-more 示例应用程序中显示了 RequesHandlerRetryAdvice 的示例。

RequestHandlerCircuitBreakerAdvice

此建议提供了断路器模式的实现。例如,如果远程服务不可用(请求在可配置的尝试次数内失败),则此 Advice 会阻止再次尝试调用该服务一段时间(可配置)。该时间过后,建议允许下一次尝试调用该服务,但是,如果服务仍然不可用,则会立即将其标记为不可用。当服务不可用时,会立即抛出异常而不会调用服务;断路器据说是“打开的”。一旦成功调用服务,断路器就会“关闭”,所有后续调用都将被路由到该服务,直到再次检测到它不可用,因为已超过配置的连续失败尝试次数。

新的 retry-and-more 示例应用程序中显示了 RequestHandlerCircuitBreakerAdvice 的示例。

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 社区中所有即将举行的活动。

查看全部