Spring Integration 2.2 新功能介紹(第 4 部分 - 重試及更多)

工程 | 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/> 應用於輪詢器。假設正在使用 Direct 通道,則此類鏈中的 AOP Advice 適用於整個流程,涵蓋所有下游元件。但是,有時最好只建議單個端點,例如,重試操作,而不是在下游元件發生故障時導致整個流程失敗並重試。

簡介

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

考慮一個 Spring Integration 流程

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

如果資料庫連線出現故障,並且我們在輪詢器上設定了重試 advice;整個流程將被重新處理;導致 http 閘道被呼叫第二次(或更多次)。

此功能提供了一種機制,可將重試 Advice(以及其他 Advice)僅應用於輸出配接器。此外,Advice 可以應用於流程中出現的許多其他端點,例如,如果 http-gateway2 失敗,我們可以僅重試它。

除了設定 Advice 鏈的一般功能外,還提供了三個 Advice 類別:

    RequestHandlerRetryAdvice RequestHandlerCircuitBreakerAdvice ExpressionEvaluatingRequestHandlerAdvice

以下更詳細地描述了這些類別,並在新的 retry-and-more 範例應用程式中進一步探索。

RequestHandlerRetryAdvice

此 advice 提供了設定重試的功能,利用了 spring-retry 專案,該專案起源於 Spring Batch。spring-retry 具有 RetryTemplate,允許設定重試策略,例如退避、復原動作等。有關更多資訊,請參閱 spring-retry 專案

重試可以是無狀態或有狀態的。無狀態重試表示重試只是在內部執行;當發生故障時,執行緒只是根據重試和退避策略進行重試。當訊息來源本身可以重試時,使用有狀態復原 - 例如交易型 JMS 或 AMQP 輸入通道配接器。在這種情況下,需要識別此訊息之前已嘗試過(例如 JMSMessageID)。為此,提供了一個基於 SpEL 的 RetryStateGenerator,它可以從標頭中提取識別碼,例如。

在這兩種情況下,當重試次數用盡時,可以調用 RecoveryCallback;這用於處置失敗的訊息。提供了一個 ErrorMessageSendingRecoverer,它將失敗的訊息發送到通道。

RequesHandlerRetryAdvice 的範例顯示在新的 retry-and-more 範例應用程式中。

RequestHandlerCircuitBreakerAdvice

此 advice 提供了斷路器模式的實作。例如,如果遠端服務不可用(請求在可設定的嘗試次數內失敗),則此 Advice 會阻止在一段(可設定的)時間內再次嘗試呼叫該服務。一旦該時間到期,advice 允許下一次嘗試呼叫服務,但是,如果服務仍然不可用,則會立即將其標記為不可用。當服務不可用時,會立即拋出異常,而無需調用服務;斷路器被稱為“開啟”。一旦成功呼叫服務,斷路器就會“關閉”,並且所有後續呼叫都將路由到服務,直到再次檢測到服務不可用,因為已超過設定的連續失敗嘗試次數。

RequestHandlerCircuitBreakerAdvice 的範例顯示在新的 retry-and-more 範例應用程式中。

ExpressionEvaluatingRequestHandlerAdvice

此 advice 提供了一種機制,在請求處理完成後(無論成功與否)都會評估 SpEL 表達式。例如,對於 FTP 輸出配接器,onSuccessExpression 可能是

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

而 onFailureExpression 可能是

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

每個表達式都有一個對應的通道,評估結果(如果有的話)將發送到該通道。

此 advice 的範例也顯示在新的 retry-and-more 範例應用程式中。

自訂 Advice 類別

雖然可以應用任何 AOP Advice,但已提供一個抽象類別來協助建立專門用於建議端點的 Advice 類別。有關更多資訊,請參閱參考文件中的 自訂 Advice 類別 章節。

結論

Spring Integration 提供了極大的彈性,可將鬆散耦合的元件組裝到應用程式中。現在可以非常輕鬆地將常見機制(例如重試)應用於該應用程式中的個別元件。有關更多資訊,請參閱 參考文件retry-and-more 範例應用程式。

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部