Spring Batch 5.1 的新功能
相依性升級
在此版本中,Spring 相依性已升級至以下版本
-
Spring Framework 6.1.0
-
Spring Integration 6.2.0
-
Spring Data 3.2.0
-
Spring LDAP 3.2.0
-
Spring AMQP 3.1.0
-
Spring Kafka 3.1.0
-
Micrometer 1.12.0
虛擬執行緒支援
擁抱 JDK 21 LTS 是 Spring Batch 5.1 的主要主題之一,尤其是來自 Project Loom 的虛擬執行緒支援。在此版本中,虛擬執行緒可用於框架的所有領域,例如使用虛擬執行緒執行並行 step,或使用虛擬執行緒並行啟動多個 step。
由於 Spring Batch 中良好設計的關注點分離,執行緒並非直接管理。執行緒管理而是委派給 Spring Framework 的 TaskExecutor 實作。這種面向介面的程式設計方法允許您以透明且彈性的方式在 TaskExecutor 實作之間切換。
在 Spring Framework 6.1 中,引入了基於虛擬執行緒的新 TaskExecutor 實作,即 VirtualThreadTaskExecutor。此 TaskExecutor 可在 Spring Batch 中任何需要 TaskExecutor 的地方使用。
JpaItemWriter 中的記憶體管理改進
當使用 JpaItemWriter 時,當區塊大小足夠大時,JPA 持久化上下文可能會快速增長。如果不及時適當清除,這可能會導致 OutOfMemoryError 錯誤。
在此版本中,JpaItemWriter 中引入了一個名為 clearPersistenceContext 的新選項,用於在寫入每個 item 區塊後清除持久化上下文。此選項改進了處理大量資料和大型區塊大小的區塊導向 step 的記憶體管理。
用於 item readers 和 writers 的新同步裝飾器
在 5.0 版本之前,Spring Batch 提供了兩個裝飾器 SynchronizedItemStreamReader 和 SynchronizedItemStreamWriter,以同步執行緒對 ItemStreamReader#read 和 ItemStreamWriter#write 的存取。當在多執行緒 step 中使用非執行緒安全的 item streams 時,這些裝飾器非常有用。
雖然這些裝飾器適用於 ItemStream 實作,但它們不能用於非 item streams。例如,這些裝飾器不能用於同步對 ListItemReader#read 或 KafkaItemWriter#write 的存取。
為了使用者的方便,此版本也為非 item streams 引入了新的裝飾器。有了這個新功能,Spring Batch 中的所有 item readers 和 writers 現在都可以同步,而無需編寫自訂裝飾器。
新的基於 Cursor 的 MongoItemReader
在 5.0 版本之前,Spring Batch 提供的 MongoItemReader 使用分頁,這是基於 MongoDB 的 skip 操作。雖然這對於小型/中型資料集效果良好,但對於大型資料集,其效能開始變差。
此版本引入了 MongoCursorItemReader,這是一個用於 MongoDB 的新基於 cursor 的 item reader。此實作使用 cursors 而不是分頁來從 MongoDB 讀取資料,這提高了在大型集合上讀取的效能。為了與其他 cursor/paging readers 保持一致性,目前的 MongoItemReader 已重新命名為 MongoPagingItemReader。
MongoItemWriter 中的批次插入支援
在 5.0 版本之前,MongoItemWriter 支援兩個操作:upsert 和 delete。雖然 upsert 操作對於插入和更新都效果良好,但對於已知在目標集合中是新的 item,其效能不佳。
與 JpaItemWriter 中的 persist 和 merge 操作類似,此版本在 MongoItemWriter 中新增了一個名為 insert 的新操作,該操作專為批次插入而設計。對於新 item,此新選項的效能優於 upsert,因為它不需要額外的查找來檢查 item 是否已存在於目標集合中。
用於 Redis 的新 item reader 和 writer
新的 RedisItemReader 現在可在內建 item readers 庫中使用。此 reader 基於 Spring Data Redis,可以使用 ScanOptions 進行配置,以掃描要從 Redis 讀取的鍵集合。
同樣地,基於 Spring Data Redis 的新 RedisItemWriter 現在是 writers 庫的一部分。此 writer 可以使用 RedisTemplate 進行配置,以將 item 寫入 Redis。
自動配置 JobRegistryBeanPostProcessor
在 Spring Batch 應用程式中配置 JobOperator 時,有必要在 operator 的 JobRegistry 中註冊 jobs。此註冊過程可以手動完成,也可以透過將 JobRegistryBeanPostProcessor bean 新增至應用程式上下文來自動完成。
在此版本中,Spring Batch 的預設配置(即透過使用 @EnableBatchProcessing 或擴展 DefaultBatchConfiguration)現在會自動將 JobRegistryBeanPostProcessor bean 註冊到應用程式上下文中。這簡化了配置過程,並在使用 JobOperator 時改善了使用者體驗。
能夠以決策開始 job 流程
當使用 XML 配置樣式時,由於有 <decision> 元素,因此可以使用決策器啟動 job 流程。但是,在 5.0 版本之前,無法使用 Java API 實現相同的流程定義。
在此版本中,JobBuilder API 中新增了一個使用 JobExecutionDecider 啟動 job 流程的新選項。這使得兩種配置樣式更加一致。
能夠提供自訂 JobKeyGenerator
預設情況下,Spring Batch 透過計算識別 job 參數的 MD5 hash 來識別 job instances。雖然不太可能需要自訂此識別過程,但 Spring Batch 仍然提供了一個策略介面,供使用者透過 JobKeyGenerator API 覆寫預設機制。
在 5.0 版本之前,如果不建立自訂 JobRepository 和 JobExplorer,則無法提供自訂鍵產生器。在此版本中,現在可以透過 JobRepository 和 JobExplorer 的 factory beans 提供自訂 JobKeyGenerator。
基於 Antora 的新文件
參考文件已更新為使用 Antora。此更新引入了許多改進,包括但不限於
-
多版本文件:現在可以透過左側選單中的下拉版本列表,從一個版本導航到另一個版本。
-
整合的搜尋體驗:由 Algolia 提供技術支援,由於頁面左上角的整合搜尋框,現在搜尋體驗更好
-
改進的配置樣式切換:用於在程式碼片段的 XML 和 Java 配置樣式之間切換的切換按鈕現在位於每個範例附近,而不是每個頁面的頂部
MongoDB Job Repository (實驗性)
此功能引入了由 MongoDB 支援的 JobRepository 和 JobExplorer 的新實作。這個期待已久的功能現在以實驗性形式提供,並標誌著 Spring Batch 第一個 NoSQL meta-data 儲存庫的引入。
有關此功能的更多詳細資訊,請參閱 Spring Batch Experimental 儲存庫。
Composite Item Reader (實驗性)
此功能引入了 composite ItemReader 實作。與 CompositeItemProcessor 和 CompositeItemWriter 類似,其想法是將讀取委派給 item readers 列表,依序進行。當需要從不同來源(檔案、資料庫等)讀取具有相同格式的資料時,這非常有用。
有關此功能的更多詳細資訊,請參閱 Spring Batch Experimental 儲存庫。
新的區塊導向 Step 實作 (實驗性)
這不是一個新功能,而是一個區塊導向處理模型的新實作。目標是解決目前實作中回報的問題,並為即將重新設計的並行模型提供新的基礎。
有關此新實作的更多詳細資訊,請參閱 Spring Batch Experimental 儲存庫。