Spring Batch 5.1 GA、5.0.4 和 4.3.10 版本現已推出!

發佈 | Mahmoud Ben Hassine | 2023 年 11 月 23 日 | ...

我謹代表團隊和所有貢獻者,很高興宣布 Spring Batch 5.1.0、5.0.4 和 4.3.10 版本現已在 Maven Central 儲存庫中提供。

5.0.4 和 4.3.10 版本是各自先前修補版本的直接替換版本,並包含錯誤修正、文件改進和相依性更新。您可以在發行說明中找到完整的變更列表:5.0.44.3.10

這篇部落格文章更著重於 Spring Batch 5.1,其中包含許多改進和新功能

  • 相依性升級
  • 虛擬執行緒支援
  • JpaItemWriter 中的記憶體管理改進
  • 項目讀取器和寫入器的新同步裝飾器
  • 新的基於游標的 MongoItemReader
  • MongoItemWriter 中的批量插入支援
  • Redis 的新項目讀取器和寫入器
  • JobRegistryBeanPostProcessor 的自動配置
  • 能夠以決策開始工作流程
  • 能夠提供自訂的 JobKeyGenerator
  • MongoDB Job Repository (實驗性)
  • 複合項目讀取器 (實驗性)
  • 基於 Antora 的新文件
  • 改版範例
  • 增強的問題回報指南

如需完整的變更列表,請查看發行說明

相依性升級

此版本將 Spring 相依性升級至以下版本

  • Spring Framework 6.1.0
  • Spring Integration 6.2.0
  • Spring Data 3.2.0
  • Spring Kafka 3.1.0
  • Spring AMQP 3.1.0
  • Spring LDAP 3.2.0
  • Micrometer 1.12.0

虛擬執行緒支援

採用 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 中的記憶體管理改進

當使用 JpaItemWriter 時,如果區塊大小夠大,JPA 持續性上下文可能會快速增長。如果未及時適當清除,可能會導致 OutOfMemoryError 錯誤。

在此里程碑版本中,JpaItemWriter 中引入了一個名為 clearPersistenceContext 的新選項,用於在寫入每個項目區塊後清除持續性上下文。此選項改進了處理大量數據且配置了較大區塊大小的面向區塊步驟的記憶體管理。

項目讀取器和寫入器的新同步裝飾器

在 5.0 版本之前,Spring Batch 提供了兩個裝飾器 SynchronizedItemStreamReaderSynchronizedItemStreamWriter,用於同步執行緒對 ItemStreamReader#readItemStreamWriter#write 的存取。當在多執行緒步驟中使用非執行緒安全項目流時,這些裝飾器很有用。

雖然這些裝飾器適用於 ItemStream 實作,但它們不能與非項目流一起使用。例如,這些裝飾器不能用於同步對 ListItemReader#readKafkaItemWriter#write 的存取。

為了方便使用者,此版本也為非項目流引入了新的裝飾器。透過這項新功能,Spring Batch 中的所有項目讀取器和寫入器現在都可以同步,而無需編寫自訂裝飾器。

新的基於游標的 MongoItemReader

在 5.0 版本之前,Spring Batch 提供的 MongoItemReader 使用分頁,這是基於 MongoDB 的 skip 操作。雖然這對於小型/中型數據集效果良好,但對於大型數據集,其效能開始變差。

此版本引入了 MongoCursorItemReader,這是一個新的基於游標的 MongoDB 項目讀取器。此實作使用游標而不是分頁來從 MongoDB 讀取數據,從而提高了大型集合的讀取效能。

為了與其他游標/分頁讀取器保持一致,目前的 MongoItemReader 已重新命名為 MongoPagingItemReader

MongoItemWriter 中的批量插入支援

在 5.0 版本之前,MongoItemWriter 支援兩種操作:upsertdelete。雖然 upsert 操作對於插入和更新都適用,但對於已知為目標集合中的新項目的項目,其效能不佳。

JpaItemWriter 中的 persistmerge 操作類似,此版本在 MongoItemWriter 中新增了一個名為 insert 的新操作,專為批量插入而設計。對於新項目,此新選項的效能優於 upsert,因為它不需要額外的查找來檢查項目是否已存在於目標集合中。

Redis 的新項目讀取器和寫入器

在 Spring Batch 的環境中使用 Redis 的典型案例是在工作執行之前/之後,使用參考數據填充/清除快取。這是一種常見的效能改進模式,在工作執行期間,它可以有效地從快取查詢數據,而不是向主資料庫發出多個查詢。

在此版本中,在內建項目讀取器和寫入器的庫中,引入了基於 Spring Data Redis 的新 RedisItemReaderRedisItemWriter。讀取器可以使用 ScanOptions 進行配置,以掃描要從 Redis 讀取的鍵集。寫入器可以使用 RedisTemplate 進行配置,以將項目寫入 Redis。

JobRegistryBeanPostProcessor 的自動配置

在 Spring Batch 應用程式中配置 JobOperator 時,必須在運算子的 JobRegistry 中註冊工作。此註冊過程可以手動完成,也可以透過將 JobRegistryBeanPostProcessor bean 新增至應用程式上下文來自動完成。

在此版本中,Spring Batch 的預設配置(即當使用 @EnableBatchProcessing 或擴展 DefaultBatchConfiguration 時)現在會自動在應用程式上下文中註冊 JobRegistryBeanPostProcessor bean。這簡化了配置過程,並改善了使用 JobOperator 時的使用者體驗。

能夠以決策開始工作流程

當使用 XML 配置樣式時,可以透過 decision 元素以決策器開始工作流程。但是,在 5.0 版本之前,無法使用 Java API 實現相同的流程定義。

此版本在 JobBuilder API 中新增了一個新選項,以使用 JobExecutionDecider 開始工作流程。這使兩種配置樣式更加一致。

能夠提供自訂的 JobKeyGenerator

預設情況下,Spring Batch 透過計算識別工作參數的雜湊值來識別工作實例。雖然不太可能需要自訂此識別過程,但 Spring Batch 仍然提供了一個策略介面,讓使用者可以透過 JobKeyGenerator API 覆寫預設機制。

在 5.0 版本之前,如果沒有建立自訂的 JobRepositoryJobExplorer,則無法提供自訂的鍵產生器。在此版本中,現在可以透過 JobRepositoryJobExplorer 的 factory bean 提供自訂的 JobKeyGenerator

MongoDB Job Repository (實驗性)

此功能引入了由 MongoDB 支援的 JobRepositoryJobExplorer 的新實作。這個期待已久的功能現在以實驗性形式提供,並標誌著 Spring Batch 首個 NoSQL 元數據儲存區的引入。

複合項目讀取器 (實驗性)

此功能引入了複合 ItemReader 實作。與 CompositeItemProcessorCompositeItemWriter 類似,其概念是將讀取委派給項目讀取器列表,依序執行。當需要從不同來源 (檔案、資料庫等) 讀取具有相同格式的數據時,此功能非常有用。

基於 Antora 的新文件

參考文件已更新為使用 Antora。此更新引入了許多改進,包括但不限於

  • 多版本文件:現在可以透過左側選單中的下拉版本列表,從一個版本導航到另一個版本。
  • 整合的搜尋體驗:由 Algolia 提供技術支援,由於頁面左上角的整合搜尋框,搜尋體驗現在更佳
  • 改進的配置樣式切換:用於在程式碼片段的 XML 和 Java 配置樣式之間切換的切換開關,現在位於每個範例附近,而不是每個頁面的頂部

您可以在此處查看新的文件版本。

更新的入門指南

入門指南 已經存在很長時間了,並且很好地展示了如何將 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 IssuesGithub DiscussionsTwitterStackOverflow 上提供您的意見回饋。

Spring Batch 首頁|Github 上的原始碼|參考文件

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

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

了解更多

取得支援

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

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部