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