領先一步
VMware 提供培訓和認證,以加速您的進度。
了解更多在本文中,我們概述了 Spring Batch 2.0 的主要主題,並重點介紹了與 1.x 的變更。新版本的開發工作正在順利進行中,上週發布了 M2 版本,並且我們獲得了廣泛的關注,因此現在似乎是提供一些提示的好時機。
新版本主要有四個主題
Spring Batch 2.0.0.M2 中專案的物理佈局沒有任何變更(相同的舊下載,相同的 Java 套件基本佈局)。我們沒有移除任何功能,但我們藉此機會修改了幾個 API,並且對於從 1.x 更新專案的使用者而言,有一些微小的變更。Spring Batch 仍然不夠成熟,我們正在新增一些非常重要的功能,因此我們認為主要版本變更是一個清理的好機會。我們預計任何人都不會遇到升級困難,如果您是現有使用者,本文將有助於您了解這些變更。
您可能知道,Spring 3.0 將是第一個專為 Java 5 設計的 Spring 主要版本(我將由 Juergen 和 Arjen 更詳細地闡明這一點)。現在 Sun 已經在 JDK 1.4 上貼上了「終止服務生命週期」標籤,這似乎很合適,並且 Spring 3.0 上有一些很棒的新功能,我們希望加以利用。
public interface ItemReader<S> {
S read();
}
此處需要注意的另一個重點是,舊的 (1.x) 框架回呼mark()和reset()已從此介面中移除,使其對最終使用者更加友善,並防止對框架的需求和時間產生誤解。相同的問題(或標記和重置)現在在框架提供的Step實作中於內部處理。
在合作夥伴ItemWriter介面中也發生了類似的變更,以及一個稍微更激進的變更,該介面由框架用於寫入資料
public interface ItemWriter<T> {
void write(List<? extends T> items);
}
舊框架的回呼flush()和clear()也已從此介面中移除,為了彌補這一點,write()方法具有新的簽章。這裡的底線是,我們已在內部轉移到區塊導向的處理範例。實際上,在批次框架中,這比舊的項目導向方法更自然,因為出於效能原因,我們通常需要緩衝和清除,而舊的介面使使用者感到笨拙。現在,您可以在write()方法中執行所需的所有批次處理。
public interface ItemProcessor<S,T> {
T process(S item);
}
在 1.x 中,型別為S的輸入項目與型別為T的輸出項目之間的轉換必須隱藏在其他參與者之一(通常是ItemWriter)中。現在,我們已經對這個問題進行了泛型化,並使其在框架中與其同級項目具有相同的重要性,ItemReader和ItemWriter。1.x 的使用者可能會在此處識別出舊ItemTransformer介面的蹤跡,該介面現已移除。
許多人查看 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 可以使用它來儲存將在回滾中保留的中間結果。
<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 使用者來說,這個選項可能更容易掌握。非循序執行
條件執行:根據
Spring Batch 1.x 始終旨在作為一個單一 VM、可能是多執行緒的模型,但我們在其中構建了許多支援多個進程並行執行的功能。許多專案已成功實作一個可擴展的解決方案,該解決方案依賴於 Spring Batch 的服務品質功能,以確保處理僅以正確的順序發生。在 2.0 中,我們計劃更明確地公開這些功能。有兩種可擴展性的方法,我們將支援這兩種方法:遠端區塊處理和分割。
使用註釋 (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 中
在 meta data 結構描述中,有一些整理任務和對資料模型的擴展。 我們將為任何從 1.x 遷移到 2.0 的人提供更新腳本,因此它們不應該引起任何問題,並且肯定會使瀏覽和與 meta data 互動更加容易。 對於那些剛接觸 Spring Batch 的人來說,該框架的一些主要優點是服務品質功能,如可重啟性和冪等性 (process business data once and only once)。 我們透過關係資料庫中的共享狀態 (在大多數用例中) 實作這些功能,並且此資料庫中資料模型的定義在 2.0 中略有變化。
主要變更是關於ExecutionContext的儲存,它過去集中在一個表中,即使上下文可以與StepExecution或JobExecution相關聯。 新模型在 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 功能,我將更詳細地展示可擴展性功能。 另請查看 論壇上的討論,或前往首頁 這裡。