領先一步
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 示例應用。