Spring Batch 2.0 新功能概覽

工程 | Dave Syer | 2008 年 10 月 21 日 | ...

在本文中,我們概述了 Spring Batch 2.0 的主要主題,並重點介紹了與 1.x 的變更。新版本的開發工作正在順利進行中,上週發布了 M2 版本,並且我們獲得了廣泛的關注,因此現在似乎是提供一些提示的好時機。

Spring Batch 2.0 主題

新版本主要有四個主題

  • Java 5 和 Spring 3.0
  • 非循序執行
  • 可擴展性
  • 配置:註解和 XML 命名空間
因此,我們將分別介紹這些領域,並描述它們的含義以及變更對 Spring Batch 現有使用者的影響。下面提供了有關已實現功能的更多詳細資訊,這些功能主要屬於第一類,並在其他領域提供了一些支援功能。

Spring Batch 2.0.0.M2 中專案的物理佈局沒有任何變更(相同的舊下載,相同的 Java 套件基本佈局)。我們沒有移除任何功能,但我們藉此機會修改了幾個 API,並且對於從 1.x 更新專案的使用者而言,有一些微小的變更。Spring Batch 仍然不夠成熟,我們正在新增一些非常重要的功能,因此我們認為主要版本變更是一個清理的好機會。我們預計任何人都不會遇到升級困難,如果您是現有使用者,本文將有助於您了解這些變更。

Java 5 和 Spring 3.0

您可能知道,Spring 3.0 將是第一個專為 Java 5 設計的 Spring 主要版本(我將由 Juergen 和 Arjen 更詳細地闡明這一點)。現在 Sun 已經在 JDK 1.4 上貼上了「終止服務生命週期」標籤,這似乎很合適,並且 Spring 3.0 上有一些很棒的新功能,我們希望加以利用。

型別安全

Spring Batch 2.0.0.M1 版本中的大部分工作都用於將現有程式碼轉換為 Java 5,並儘可能利用泛型和參數化型別。這為框架使用者提供了更友好的程式設計體驗,允許對型別安全進行編譯時檢查,並最終降低了使用 Spring Batch 的專案的維護成本。例如,在ItemReader中,這是 Spring Batch 中一個核心介面和使用者擴充點,我們現在有一個型別安全的read方法

public interface ItemReader<S> {
    S read();
}

此處需要注意的另一個重點是,舊的 (1.x) 框架回呼mark()reset()已從此介面中移除,使其對最終使用者更加友善,並防止對框架的需求和時間產生誤解。相同的問題(或標記和重置)現在在框架提供的Step實作中於內部處理。

Chunk 導向處理

在合作夥伴ItemWriter介面中也發生了類似的變更,以及一個稍微更激進的變更,該介面由框架用於寫入資料


public interface ItemWriter<T> {
    void write(List<? extends T> items);
}

舊框架的回呼flush()clear()也已從此介面中移除,為了彌補這一點,write()方法具有新的簽章。這裡的底線是,我們已在內部轉移到區塊導向的處理範例。實際上,在批次框架中,這比舊的項目導向方法更自然,因為出於效能原因,我們通常需要緩衝和清除,而舊的介面使使用者感到笨拙。現在,您可以在write()方法中執行所需的所有批次處理。

Step Factory Bean 變更

區塊導向處理方法的一個副作用是步驟 factory bean 實作中的變更。舊的SkipLimitStepFactoryBean已重新命名為FaultTolerantStepFactoryBean,並且它仍然可以用作舊 factory bean 的替代品,適用於大多數常見的使用案例。預設情況下,它會建立一個步驟實作,該實作會跨回滾緩衝輸入項目,以便新的ItemReaderItemWriter介面可以與非交易輸入來源(例如檔案)正確運作。對於在回滾後重新呈現項目的輸入來源,用戶必須在 factory bean 中設定一個旗標 (isReaderTransactional是 M2 的旗標名稱) -JmsItemReader是框架中唯一相關的讀取器,並且沒有太多專案使用它,因此這不是一個很大的變更。

商業處理

一個相關的新功能是,有一個新的成員加入了,那就是ItemProcessor:

public interface ItemProcessor<S,T> {
    T process(S item);
}

在 1.x 中,型別為S的輸入項目與型別為T的輸出項目之間的轉換必須隱藏在其他參與者之一(通常是ItemWriter)中。現在,我們已經對這個問題進行了泛型化,並使其在框架中與其同級項目具有相同的重要性,ItemReaderItemWriter。1.x 的使用者可能會在此處識別出舊ItemTransformer介面的蹤跡,該介面現已移除。

更有用的 Tasklet 介面

許多人查看 Spring Batch 1.x 時,都會問「如果我的商業邏輯不是讀取和寫入怎麼辦?」為了更令人滿意地回答這個問題,我們修改了Tasklet介面。在 Spring Batch 1.x 中,它相當平淡 - 幾乎只是Callable事實上,但在 2.0 中,我們賦予了它更大的靈活性,並將其更多地納入框架的主流中(例如,核心的區塊導向步驟實作現在實作為Tasklet)。這是新的介面


public interface Tasklet {
    ExitStatus execute(StepContribution contribution, 
        AttributeAccessor attributes);
}

這個想法是 tasklet 現在可以更多地回饋到封閉步驟中,這使其成為一個更靈活的平台,用於實作商業邏輯。StepContribution已經是 1.x API 的一部分,但它沒有被公開。它的作用是收集對目前StepExecution的更新,而程式設計人員無需擔心另一個執行緒中的並行修改。這也告訴我們Tasklet將被重複呼叫(而不是像 1.x 框架中每個步驟只呼叫一次),因此它可用於執行更大範圍的商業處理任務。AttributeAccessor是一個區塊範圍的鍵值對集合。tasklet 可以使用它來儲存將在回滾中保留的中間結果。

Job 和 Step 屬性的延遲綁定

到目前為止(直到 M2),我們還無法利用任何新的 Spring 3.0 功能,因為還沒有 Spring 3.0 的發布版本。但從下一個里程碑 (M3) 開始,我們將使用新的 Spring EL(表達式語言)功能來啟用JobParametersExecutionContext屬性與步驟元件的延遲綁定。這是一個非常需要的功能,並且我們在 1.x 中針對特殊情況提供了一些解決方案,例如StepExecutionResourceProxy用於綁定到檔案名作為作業的輸入參數。Spring Batch 2.0 中提供的一個更通用的解決方案是允許將這些步驟屬性綁定到任意元件,方法是在適當的 Spring 範圍內定義它們,例如

<bean id="step1" parent="simpleStep">
  <property name="itemReader">
    <bean class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
        <property value="#{jobParameters[inputFile]}" />
        ...
    </bean>
  </property>
  ...
</bean>

項目讀取器需要綁定到僅在運行時可用的檔案名。為此,我們已將其宣告為 scope="step",並使用 Spring EL 綁定模式#{...}以綁定到一個作業參數中。相同的模式也適用於步驟和作業層級的執行內容屬性。

StepScope在每晚快照中可用,但我們仍在使用 Spring 2.5.5,因此 EL 綁定尚未運作。步驟範圍 bean 也是解決如何保持步驟執行緒安全的舊 Spring Batch 問題的一個好方法。如果一個步驟依賴於一個有狀態的元件,例如FlatFileItemReader,那麼它只需要將該元件定義為 scope="step",並且框架會為其建立一個延遲初始化代理,並且它會在每個步驟執行時根據需要建立。為每個作業執行建立一個新的ApplicationContext仍然沒有錯,這是目前 1.x 中防止執行緒跨作業衝突的最佳實務。但現在步驟範圍為您提供了另一個選項,對於大多數 Spring 使用者來說,這個選項可能更容易掌握。非循序執行

在 1.x 中,作業模型始終是步驟的線性序列,如果一個步驟失敗,則作業失敗。儘管許多作業仍然符合這種模式,因此它沒有消失,但在 2.0 中,我們透過引入一些新功能來解除這種限制。這些功能計劃在 M3 版本中發布,因此實作細節可能會有所變更,但這個想法是支援三個功能

條件執行:根據

  • ExitStatus分支出不同的步驟。這包括根據 FAILED 狀態分支的能力,這意味著步驟失敗不再對作業致命。
  • 暫停執行並等待明確的指示才能繼續。例如,當存在強制手動干預以檢查業務關鍵資料有效性的業務規則時,這非常有用。
  • 並行執行多個步驟。如果步驟是獨立的,使用者可以指定哪些分支可以並行執行。
在撰寫本文時,每晚快照包含一個ConditionalJob,它支援上述第一個用例。

可擴展性

Spring Batch 1.x 始終旨在作為一個單一 VM、可能是多執行緒的模型,但我們在其中構建了許多支援多個進程並行執行的功能。許多專案已成功實作一個可擴展的解決方案,該解決方案依賴於 Spring Batch 的服務品質功能,以確保處理僅以正確的順序發生。在 2.0 中,我們計劃更明確地公開這些功能。有兩種可擴展性的方法,我們將支援這兩種方法:遠端區塊處理和分割。

遠端區塊處理

遠端分塊 (Remote chunking) 是一種技術,用於劃分一個步驟的工作,而無需明確了解資料的結構。 任何輸入來源都可以動態地分割,方法是在單一進程中讀取它 (如同 1.x 中的正常做法),並將項目作為一個區塊發送到遠端工作進程。 遠端進程實作一個監聽器模式,回應請求、處理資料並發送非同步回覆。 請求和回覆的傳輸必須是持久的,具有保證的傳遞和單一消費者,這些功能可以透過任何 JMS 實作輕鬆獲得。 但是 Spring Batch 正在 Spring One Americas

配置:註解和 XML 命名空間

使用註釋 (Annotations) 實作批次邏輯的想法是類比於 Spring @MVC。 最終效果是,您不必實作並可能註冊一堆介面 (reader, writer, processor, listeners 等),而是只需註釋一個 POJO 並將其插入一個步驟中。 有與各種介面相對應的方法級別註釋,以及與 job、step 和 chunk 級別屬性相對應的參數級別註釋和 factory 方法 (有點像@ModelParameter@RequestParameter在 Spring @MVC 中。

Spring Batch 的 XML 命名空間使常見事物的配置更加容易。 例如,上面ConditionalJob提到的有一個 XML 配置選項,因此一個簡單的條件執行可能如下所示


<job>
  <step name="gamesLoad" next="playerLoad"/>
  <step name="playerLoad">
    <next on="*" to="summarize"/>
    <next on="FAILED" to="compensate"/>
  </step>
  <step name="compensate"/>
  <step name="summarize"/>
</job>

第一個步驟 ("gamesLoad") 緊接著是 "playerLoad",但如果該步驟失敗,那麼我們可以轉到替代步驟 ("compensate"),而不是正常完成 "summarize" 步驟。 XML 中 <step元素的 name= 屬性是一個 bean 參考,因此 的實作Step在其他地方定義 (可能透過註釋)。

資料庫結構描述變更

在 meta data 結構描述中,有一些整理任務和對資料模型的擴展。 我們將為任何從 1.x 遷移到 2.0 的人提供更新腳本,因此它們不應該引起任何問題,並且肯定會使瀏覽和與 meta data 互動更加容易。 對於那些剛接觸 Spring Batch 的人來說,該框架的一些主要優點是服務品質功能,如可重啟性和冪等性 (process business data once and only once)。 我們透過關係資料庫中的共享狀態 (在大多數用例中) 實作這些功能,並且此資料庫中資料模型的定義在 2.0 中略有變化。

主要變更是關於ExecutionContext的儲存,它過去集中在一個表中,即使上下文可以與StepExecutionJobExecution相關聯。 新模型在 DDL 中使關係更加透明,因此將更受 DBAs 歡迎。 我們還開始將上下文值儲存在 JSON 中,以便使它們更容易讀取和追蹤 (單一實體的上下文都儲存在一個表的一行中,而不是許多行)。

我們還為已執行和已跳過的項目添加了更多統計資訊,分割了每個階段讀取、處理和寫入的總項目計數。 對於不將其執行分割為 read, process, write 的步驟 (或 tasklets),這比需要的更全面,但對於大多數用例來說,它比僅儲存總項目計數更合適。

總結

希望本文激發了您對 Spring Batch 2.0 的興趣,並且您將有時間下載快照或里程碑版本並嘗試使用它。 我們從社群獲得了如此好的回饋,如果沒有您的幫助和支援,該產品將不會有一半那麼好。 如果我錯過了您感興趣的內容,或者沒有提供足夠的詳細資訊,我深表歉意,但我需要將其壓縮成一個合理的部落格大小格式。 如果有人有興趣,我可以寫更多 - 只要提出要求即可。

如果您想了解更多資訊,那麼今年在 Spring One Americas 有一個絕佳的機會可以從團隊那裡聽到有關 Spring Batch 2.0 和所有其他 SpringSource 活動的資訊。 Lucas Ward 將在一個會議中介紹 Spring Batch 2.0 功能,我將更詳細地展示可擴展性功能。 另請查看 論壇上的討論,或前往首頁 這裡

取得 Spring 電子報

與 Spring 電子報保持聯繫

訂閱

領先一步

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

了解更多

獲得支援

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

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看全部