领先一步
VMware 提供培训和认证,助您快速提升。
了解更多Spring Integration 2.2 引入了向消息处理器应用一个或多个局部 AOP Advice(通知)元素的能力。还提供了一些标准的 Advice 类以及一个探索这些特性功能的示例应用。
有关面向切面编程 (AOP) 的一般介绍,请参阅Spring 文档
到目前为止,在使用 Spring Integration 时,可以将 <advice-chain/>
应用于轮询器。假设使用 Direct 通道,链中的 AOP Advice 应用于整个流,包含所有下游组件。然而,有时仅对单个端点应用通知会更有利,例如重试操作,而不是当远下游的某个组件失败时导致整个流失败并被重试。
<request-handler-advice-chain/>
。考虑一个 Spring Integration 流
some-inbound-adapter<-poller->http-gateway1->http-gateway2->jdbc-outbound-adapter
如果数据库连接出现故障,并且我们在轮询器上设置了重试通知;整个流将被重新处理;导致两个 http 网关都被二次(或多次)调用。
此特性提供了一种机制,可以(除其他外)仅对外发适配器应用重试通知。此外,该通知可以应用于许多其他端点,无论它们在流中出现的位置如何,例如,如果 http-gateway2 失败,我们可以仅重试它。
除了配置 Advice 链的通用能力之外,还提供了三个 Advice 类:
这些在下面有更详细的描述,并在新的 retry-and-more 示例应用中进行了进一步探索。
此通知提供了配置重试的能力,利用了起源于 Spring Batch 的 spring-retry 项目。spring-retry 有一个 RetryTemplate,允许配置重试策略,例如回退(back-off)、恢复操作等。有关更多信息,请参阅 spring-retry 项目。
重试可以是无状态的或有状态的。无状态重试意味着重试仅在内部执行;发生故障时,线程仅根据重试和回退策略进行重试。有状态恢复用于消息源本身可以重试的情况——例如事务性的 JMS 或 AMQP 入站通道适配器。在这种情况下,需要识别该消息是否之前已被尝试过(例如 JMSMessageID)。为此,提供了基于 SpEL 的 RetryStateGenerator,例如可以从头部提取标识符。
在这两种情况下,当重试次数用尽时,可以调用 RecoveryCallback;这用于处理失败的消息。提供了一个 ErrorMessageSendingRecoverer,它将失败的消息发送到一个通道。
RequestHandlerRetryAdvice 的示例在新发布的 retry-and-more 示例应用中有所展示。
此通知提供了断路器模式(Circuit Breaker pattern)的实现。例如,如果远程服务不可用(请求失败达到可配置的次数),此通知会在一段(可配置的)时间内阻止再次调用该服务。一旦该时间到期,通知将允许下一次尝试调用服务,但是,如果服务仍然不可用,它会立即被标记为不可用。当服务不可用时,会立即抛出异常而无需调用服务;此时断路器被称为处于“开启”(open)状态。一旦服务调用成功,断路器就会“关闭”(closed),并且所有后续调用都将路由到该服务,直到再次检测到服务不可用,因为连续失败尝试的次数超过了配置的阈值。
RequestHandlerCircuitBreakerAdvice 的示例在新发布的 retry-and-more 示例应用中有所展示。
此通知提供了一种机制,在请求处理后(无论成功还是失败)会评估一个 SpEL 表达式。例如,对于 FTP 出站适配器,onSuccessExpression 可能如下所示:
"payload.reNameTo('/foo/succeeded/" + payload.name)"
,
而 onFailureExpression 可能如下所示:
"payload.reNameTo('/foo/failed/" + payload.name)"
.
每个表达式都有一个相应的通道,评估结果(如果有的话)将发送到该通道。
此通知的示例也在新发布的 retry-and-more 示例应用中有所展示。
Spring Integration 提供了极大的灵活性,可将松散耦合的组件组装到应用中。现在,将重试等常见机制应用于应用中的单个组件变得极其容易。有关更多信息,请参阅参考文档和 retry-and-more 示例应用。