領先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多我謹代表團隊和所有貢獻者,很高興宣布 Spring Batch 5.1.0、5.0.4 和 4.3.10 版本現已在 Maven Central 儲存庫中提供。
5.0.4 和 4.3.10 版本是各自先前修補版本的直接替換版本,並包含錯誤修正、文件改進和相依性更新。您可以在發行說明中找到完整的變更列表:5.0.4 和 4.3.10。
這篇部落格文章更著重於 Spring Batch 5.1,其中包含許多改進和新功能
JpaItemWriter
中的記憶體管理改進MongoItemReader
MongoItemWriter
中的批量插入支援JobRegistryBeanPostProcessor
的自動配置JobKeyGenerator
如需完整的變更列表,請查看發行說明。
此版本將 Spring 相依性升級至以下版本
採用 JDK 21 LTS 是 Spring Batch 5.1 的主要主題之一,尤其是來自 Project Loom 的虛擬執行緒支援。在此版本中,虛擬執行緒可用於框架的所有領域,例如使用虛擬執行緒執行並行步驟,或使用虛擬執行緒並行啟動多個步驟。
由於 Spring Batch 中完善的關注點分離設計,執行緒並非直接管理。執行緒管理而是委派給 Spring Framework 的 TaskExecutor
實作。這種針對介面編程的方法讓您可以以透明且彈性的方式在 TaskExecutor
實作之間切換。
在 Spring Framework 6.1 中,引入了基於虛擬執行緒的新 TaskExecutor
實作,即 VirtualThreadTaskExecutor
。此 TaskExecutor
可在 Spring Batch 中任何需要 TaskExecutor
的地方使用。以下範例示範如何使用虛擬執行緒配置多執行緒步驟
@Bean
public VirtualThreadTaskExecutor taskExecutor() {
return new VirtualThreadTaskExecutor("spring-batch-");
}
@Bean
public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager,
ItemReader<Integer> itemReader, ItemWriter<Integer> itemWriter,
VirtualThreadTaskExecutor taskExecutor) {
return new StepBuilder("step", jobRepository).<Integer, Integer>chunk(2, transactionManager)
.reader(itemReader)
.writer(itemWriter)
.taskExecutor(taskExecutor)
.build();
}
當使用 JpaItemWriter
時,如果區塊大小夠大,JPA 持續性上下文可能會快速增長。如果未及時適當清除,可能會導致 OutOfMemoryError
錯誤。
在此里程碑版本中,JpaItemWriter
中引入了一個名為 clearPersistenceContext
的新選項,用於在寫入每個項目區塊後清除持續性上下文。此選項改進了處理大量數據且配置了較大區塊大小的面向區塊步驟的記憶體管理。
在 5.0 版本之前,Spring Batch 提供了兩個裝飾器 SynchronizedItemStreamReader
和 SynchronizedItemStreamWriter
,用於同步執行緒對 ItemStreamReader#read
和 ItemStreamWriter#write
的存取。當在多執行緒步驟中使用非執行緒安全項目流時,這些裝飾器很有用。
雖然這些裝飾器適用於 ItemStream
實作,但它們不能與非項目流一起使用。例如,這些裝飾器不能用於同步對 ListItemReader#read
或 KafkaItemWriter#write
的存取。
為了方便使用者,此版本也為非項目流引入了新的裝飾器。透過這項新功能,Spring Batch 中的所有項目讀取器和寫入器現在都可以同步,而無需編寫自訂裝飾器。
在 5.0 版本之前,Spring Batch 提供的 MongoItemReader
使用分頁,這是基於 MongoDB 的 skip
操作。雖然這對於小型/中型數據集效果良好,但對於大型數據集,其效能開始變差。
此版本引入了 MongoCursorItemReader
,這是一個新的基於游標的 MongoDB 項目讀取器。此實作使用游標而不是分頁來從 MongoDB 讀取數據,從而提高了大型集合的讀取效能。
為了與其他游標/分頁讀取器保持一致,目前的 MongoItemReader
已重新命名為 MongoPagingItemReader
。
在 5.0 版本之前,MongoItemWriter
支援兩種操作:upsert
和 delete
。雖然 upsert
操作對於插入和更新都適用,但對於已知為目標集合中的新項目的項目,其效能不佳。
與 JpaItemWriter
中的 persist
和 merge
操作類似,此版本在 MongoItemWriter
中新增了一個名為 insert
的新操作,專為批量插入而設計。對於新項目,此新選項的效能優於 upsert
,因為它不需要額外的查找來檢查項目是否已存在於目標集合中。
在 Spring Batch 的環境中使用 Redis 的典型案例是在工作執行之前/之後,使用參考數據填充/清除快取。這是一種常見的效能改進模式,在工作執行期間,它可以有效地從快取查詢數據,而不是向主資料庫發出多個查詢。
在此版本中,在內建項目讀取器和寫入器的庫中,引入了基於 Spring Data Redis 的新 RedisItemReader
和 RedisItemWriter
。讀取器可以使用 ScanOptions
進行配置,以掃描要從 Redis 讀取的鍵集。寫入器可以使用 RedisTemplate
進行配置,以將項目寫入 Redis。
在 Spring Batch 應用程式中配置 JobOperator
時,必須在運算子的 JobRegistry
中註冊工作。此註冊過程可以手動完成,也可以透過將 JobRegistryBeanPostProcessor
bean 新增至應用程式上下文來自動完成。
在此版本中,Spring Batch 的預設配置(即當使用 @EnableBatchProcessing
或擴展 DefaultBatchConfiguration
時)現在會自動在應用程式上下文中註冊 JobRegistryBeanPostProcessor
bean。這簡化了配置過程,並改善了使用 JobOperator
時的使用者體驗。
當使用 XML 配置樣式時,可以透過 decision
元素以決策器開始工作流程。但是,在 5.0 版本之前,無法使用 Java API 實現相同的流程定義。
此版本在 JobBuilder
API 中新增了一個新選項,以使用 JobExecutionDecider
開始工作流程。這使兩種配置樣式更加一致。
預設情況下,Spring Batch 透過計算識別工作參數的雜湊值來識別工作實例。雖然不太可能需要自訂此識別過程,但 Spring Batch 仍然提供了一個策略介面,讓使用者可以透過 JobKeyGenerator
API 覆寫預設機制。
在 5.0 版本之前,如果沒有建立自訂的 JobRepository
和 JobExplorer
,則無法提供自訂的鍵產生器。在此版本中,現在可以透過 JobRepository
和 JobExplorer
的 factory bean 提供自訂的 JobKeyGenerator
。
此功能引入了由 MongoDB 支援的 JobRepository
和 JobExplorer
的新實作。這個期待已久的功能現在以實驗性形式提供,並標誌著 Spring Batch 首個 NoSQL 元數據儲存區的引入。
此功能引入了複合 ItemReader
實作。與 CompositeItemProcessor
和 CompositeItemWriter
類似,其概念是將讀取委派給項目讀取器列表,依序執行。當需要從不同來源 (檔案、資料庫等) 讀取具有相同格式的數據時,此功能非常有用。
參考文件已更新為使用 Antora。此更新引入了許多改進,包括但不限於
您可以在此處查看新的文件版本。
入門指南 已經存在很長時間了,並且很好地展示了如何將 Spring Batch 與 Spring Boot 一起使用。但是,並非所有使用者都是 Spring Boot 使用者,並且常見的要求之一是提供與純 Spring Batch 相同的入門體驗。
因此,我們引入了一個新的 兩分鐘教學,其中包含逐步指南,說明如何建立 Spring Batch 專案並實作簡單的「Hello world」工作。這應該可以改善非 Boot 使用者的入門體驗。也就是說,目前的基於 Spring Boot 的指南已更新至最新的 Spring Boot 3 版本,以展示如何在 Spring Batch 5 中使用 Java Records 支援等新功能。
在此版本中,我們重新設計了範例套件中的所有程式碼範例。範例現在按功能組織在不同的套件中。這讓您可以更輕鬆地理解和學習 Spring Batch 中的特定功能。主要的 README
檔案包含一個表格,顯示可用的範例及其涵蓋的功能:Spring Batch 範例。
此外,每個範例現在都有自己的 README
檔案,詳細說明了範例並提供了執行說明。範例現在可以從 IDE 或命令列作為單元測試執行,以獲得「複製並執行」的體驗。有了新的結構,您只需兩個命令即可在本地環境中獲得一個正在運行的 Spring Batch 範例!
最後,大多數範例現在都以兩種 Spring 配置樣式實作:Java 配置樣式和 XML 配置樣式。這讓您可以更輕鬆地比較兩種配置樣式,並在將 XML 配置遷移到 Java 配置時為您提供協助。
正如在嘗試新專案或貢獻現有專案時擁有良好的使用者體驗非常重要一樣,我們認為在回報問題時擁有良好的體驗也很重要。因此,作為「改善入門體驗」主題的一部分,我們重新設計了問題回報流程,以提供關於如何回報問題的逐步指南:問題回報指南。
新指南包含一個專案範本,其中包含一個使用嵌入式資料來源的最小完整可驗證範例。此範本是您可以根據需要編輯以重現問題的起點。該指南還為涉及 PostgreSQL 或 MySQL 等非嵌入式資料庫的問題提供了 Docker + TestContainers 範本。
首先,我要感謝所有在此版本中做出貢獻的貢獻者!Spring Batch 5.1.0 隨附 Spring Boot 3.2.0。
我們期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供您的意見回饋。