領先一步
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
的訪問。這些裝飾器在多執行緒步驟中使用非執行緒安全的 Item Streams 時非常有用。
雖然這些裝飾器適用於 ItemStream
實現,但它們不能用於非 Item Streams。例如,這些裝飾器不能用於同步對 ListItemReader#read
或 KafkaItemWriter#write
的訪問。
為了方便使用者,此版本還為非 Item Streams 引入了新的裝飾器。藉助此新功能,Spring Batch 中的所有 Item Reader 和 Writer 現在都可以同步,而無需編寫自定義裝飾器。
直到 5.0 版本,Spring Batch 提供的 MongoItemReader
使用分頁,這是基於 MongoDB 的 skip
操作。雖然這對小型/中型資料集效果很好,但對於大型資料集,其效能開始變差。
此版本引入了 MongoCursorItemReader
,這是一個新的基於遊標的 MongoDB Item Reader。此實現使用遊標而不是分頁來從 MongoDB 讀取資料,這改進了對大型集合的讀取效能。
為了與其他基於遊標/分頁的 Reader 保持一致,當前的 MongoItemReader
已重新命名為 MongoPagingItemReader
。
直到 5.0 版本,MongoItemWriter
支援兩種操作:upsert
和 delete
。雖然 upsert
操作對於插入和更新都效果很好,但對於目標集合中已知為新的專案,其效能不佳。
與 JpaItemWriter
中的 persist
和 merge
操作類似,此版本在 MongoItemWriter
中添加了一個名為 insert
的新操作,該操作專為批次插入設計。對於新專案,此新選項的效能優於 upsert
,因為它不需要額外的查詢來檢查目標集合中是否存在專案。
在 Spring Batch 的上下文中,使用 Redis 的一個典型場景是在作業執行之前/之後使用參考資料填充/清除快取。這是一種常見的效能改進模式,用於從快取查詢資料,而不是在作業執行期間向主資料庫發出多次查詢。
在此版本中,基於 Spring Data Redis 的新 RedisItemReader
和 RedisItemWriter
已引入內建 Item Reader 和 Writer 庫中。可以透過 ScanOptions
配置 Reader 以掃描要從 Redis 讀取的鍵集。可以透過 RedisTemplate
配置 Writer 以將專案寫入 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
的工廠 bean 提供自定義的 JobKeyGenerator
。
此特性引入了由 MongoDB 支援的新的 JobRepository
和 JobExplorer
實現。這個期待已久的特性現已作為實驗性功能提供,標誌著 Spring Batch 第一個 NoSQL 元資料儲存的引入。
此特性引入了一個複合 ItemReader
實現。與 CompositeItemProcessor
和 CompositeItemWriter
類似,其思想是將讀取依次委託給 Item Reader 列表。當需要從不同來源(檔案、資料庫等)讀取具有相同格式的資料時,這非常有用。
參考文件已更新為使用 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 上提供反饋。