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