保持領先
VMware 提供培訓和認證,助您快速提升。
瞭解更多我代表團隊和所有貢獻者高興地宣佈,Spring Batch 5.2 現已在 Maven Central 全面可用。這篇博文將引導您瞭解此版本中的主要新增功能。有關完整的更改列表,請參閱釋出說明。
此版本的主要亮點如下
在此版本中,Spring 依賴項已升級到以下版本
此版本引入了第一個由 MongoDB 支援的 NoSQL 作業倉庫實現。與關係型作業倉庫實現類似,Spring Batch 提供了一個指令碼,用於在 MongoDB 中建立必要的集合,以便儲存和檢索批處理元資料。
此實現要求 MongoDB 版本 4 或更高,並且基於 Spring Data MongoDB。要使用此作業倉庫,您只需定義一個 MongoTemplate
和一個 MongoTransactionManager
,新新增的 MongoDBJobRepositoryFactoryBean
需要它們。
@Bean
public JobRepository jobRepository(MongoTemplate mongoTemplate, MongoTransactionManager transactionManager) throws Exception {
MongoJobRepositoryFactoryBean jobRepositoryFactoryBean = new MongoJobRepositoryFactoryBean();
jobRepositoryFactoryBean.setMongoOperations(mongoTemplate);
jobRepositoryFactoryBean.setTransactionManager(transactionManager);
jobRepositoryFactoryBean.afterPropertiesSet();
return jobRepositoryFactoryBean.getObject();
}
定義了 MongoDB 作業倉庫後,您可以將其作為常規作業倉庫注入到任何作業或步驟中。您可以在 MongoDBJobRepositoryIntegrationTests 中找到一個完整示例。
在 v5 版本中,基於記憶體 Map 的作業倉庫實現因多種原因被移除。Spring Batch 中唯一剩下的作業倉庫實現是 JDBC 實現,它需要一個數據源。雖然這與 H2 或 HSQLDB 等記憶體資料庫配合得很好,但對於我們社群中許多曾經使用基於 Map 的倉庫而無需額外依賴的使用者來說,要求資料來源是一個很大的限制。
在此版本中,我們引入了一個不使用或儲存任何形式(甚至記憶體中)的批處理元資料的 JobRepository
實現。這是一個“無操作”(NoOp) 實現,它丟棄批處理元資料,並且不與任何資源互動(因此得名“無資源作業倉庫”,類似於“無資源事務管理器”)。
此實現適用於那些不需要可重啟性,並且執行上下文不以任何方式參與的用例(例如透過執行上下文在步驟之間共享資料,或者在分割槽步驟中透過執行上下文在管理器和工作器之間共享分割槽元資料等)。
此實現適用於在其自己的 JVM 中執行的一次性作業。它適用於事務性步驟(例如配置了 DataSourceTransactionManager
)和非事務性步驟(配置了 ResourcelessTransactionManager
)。此實現非執行緒安全,並且不應在任何併發環境中使用。
與 CompositeItemProcessor
和 CompositeItemWriter
類似,我們引入了一個新的 CompositeItemReader
實現,它旨在按順序從具有相同格式的多個源讀取資料。當資料分散在不同資源上且無法編寫自定義讀取器時,這非常有用。
CompositeItemReader
的工作方式與其他複合構件類似,透過按順序將讀取操作委託給常規項讀取器。這是一個快速示例,展示了一個複合讀取器,它首先從平面檔案讀取人員資料,然後從關係資料庫表讀取。
@Bean
public FlatFileItemReader<Person> itemReader1() {
return new FlatFileItemReaderBuilder<Person>()
.name("personFileItemReader")
.resource(new FileSystemResource("persons.csv"))
.delimited()
.names("id", "name")
.targetType(Person.class)
.build();
}
@Bean
public JdbcCursorItemReader<Person> itemReader2() {
String sql = "select * from persons";
return new JdbcCursorItemReaderBuilder<Person>()
.name("personTableItemReader")
.dataSource(dataSource())
.sql(sql)
.beanRowMapper(Person.class)
.build();
}
@Bean
public CompositeItemReader<Person> itemReader() {
return new CompositeItemReader<>(Arrays.asList(itemReader1(), itemReader2()));
}
與將 java.util.function.Function
適配為項處理器的 FunctionItemProcessor
類似,此版本為其他 java.util.function
介面(如 Supplier
、Consumer
和 Predicate
)引入了幾個新的介面卡。
新新增的介面卡包括:SupplierItemReader
、ConsumerItemWriter
和 PredicateFilteringItemProcessor
。有關這些新介面卡的更多詳細資訊,請參閱 org.springframework.batch.item.function 包。
分階段事件驅動架構 (SEDA) 是一種強大的架構風格,用於透過佇列連線的階段處理資料。由於 Spring Batch 能夠將作業設計為一系列步驟,這種風格可以直接應用於資料管道並易於實現。
這裡唯一缺少的部分是如何從中間佇列讀取資料並寫入資料。此版本引入了一個項讀取器和一個項寫入器,用於從 BlockingQueue
讀取資料並寫入資料。透過這兩個新類,可以設計第一個步驟將資料準備到佇列中,然後設計第二個步驟從同一佇列消費資料。這樣,兩個步驟可以併發執行,以非阻塞、事件驅動的方式高效處理資料。
在 5.1 版本之前,JPA 遊標和分頁項讀取器不支援查詢提示(例如 fetch size, timeout 等)。使用者需要提供一個自定義查詢提供者才能指定自定義提示。
在此版本中,JPA 讀取器及其各自的構建器已更新,以在定義要使用的 JPA 查詢時接受查詢提示。
此版本在 JDBC 遊標和分頁項讀取器的構建器中引入了一個新方法,允許使用者在項型別是 data class(Java record 或 Kotlin data class)時指定 DataClassRowMapper
。
新方法 dataRowMapper(TargetType.class)
與 beanRowMapper(TargetType.class)
類似,旨在使常規類(Java bean)和 data class(Java record)之間的行對映器配置保持一致。
在 5.1 版本中,批處理基礎設施 bean 的預設配置已更新,透過在應用上下文中定義 JobRegistryBeanPostProcessor
bean 來自動填充作業登錄檔。最近 Spring Framework 中更改 BeanPostProcessorChecker
日誌級別的一項更新後,典型 Spring Batch 應用中記錄了與 JobRegistryBeanPostProcessor
相關的幾個警告。這些警告是由於 JobRegistryBeanPostProcessor
bean 依賴於 JobRegistry
bean,這不推薦,並可能導致 bean 生命週期問題。
這些問題在此版本中得到了解決,透過將填充 JobRegistry
的機制從使用 BeanPostProcessor
更改為使用 SmartInitializingSingleton
。JobRegistryBeanPostProcessor
現已棄用,取而代之的是新新增的 JobRegistrySmartInitializingSingleton
。
首先,感謝所有為此版本做出貢獻的人!對於 Spring Boot 使用者,可以透過 Spring Boot 3.4 獲取 Spring Batch 5.2。
我們期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供反饋。
請注意:Spring Batch 5.1.x 將於 2024 年 11 月 22 日之後結束開源支援。因此,我鼓勵我們的使用者儘快將其應用升級到 Spring Batch 5.2.0。