Spring Batch 5.2.0 正式釋出!

釋出 | Mahmoud Ben Hassine | 2024 年 11 月 20 日 | ...

我代表團隊和所有貢獻者高興地宣佈,Spring Batch 5.2 現已在 Maven Central 全面可用。這篇博文將引導您瞭解此版本中的主要新增功能。有關完整的更改列表,請參閱釋出說明

主要亮點

此版本的主要亮點如下

  • 依賴升級
  • 支援 MongoDB 作業倉庫
  • 新的無資源作業倉庫
  • 複合項讀取器實現
  • 新的 java.util.function API 介面卡
  • 基於阻塞佇列項讀取器和寫入器的併發步驟
  • JPA 項讀取器中支援查詢提示
  • JDBC 項讀取器中支援 Data Class
  • 作業註冊改進

依賴升級

在此版本中,Spring 依賴項已升級到以下版本

  • Spring Framework: 6.2.0
  • Spring Integration: 6.4.0
  • Spring Data: 3.4.0
  • Spring Kafka: 3.3.0
  • Spring AMQP: 3.2.0
  • Spring Retry: 2.0.10
  • Spring Ldap: 3.2.8
  • Micrometer: 1.14.1

支援 MongoDB 作業倉庫

此版本引入了第一個由 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)。此實現執行緒安全,並且不應在任何併發環境中使用。

複合項讀取器實現

CompositeItemProcessorCompositeItemWriter 類似,我們引入了一個新的 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 API 介面卡

與將 java.util.function.Function 適配為項處理器的 FunctionItemProcessor 類似,此版本為其他 java.util.function 介面(如 SupplierConsumerPredicate)引入了幾個新的介面卡。

新新增的介面卡包括:SupplierItemReaderConsumerItemWriterPredicateFilteringItemProcessor。有關這些新介面卡的更多詳細資訊,請參閱 org.springframework.batch.item.function 包。

基於阻塞佇列項讀取器和寫入器的併發步驟

分階段事件驅動架構 (SEDA) 是一種強大的架構風格,用於透過佇列連線的階段處理資料。由於 Spring Batch 能夠將作業設計為一系列步驟,這種風格可以直接應用於資料管道並易於實現。

這裡唯一缺少的部分是如何從中間佇列讀取資料並寫入資料。此版本引入了一個項讀取器和一個項寫入器,用於從 BlockingQueue 讀取資料並寫入資料。透過這兩個新類,可以設計第一個步驟將資料準備到佇列中,然後設計第二個步驟從同一佇列消費資料。這樣,兩個步驟可以併發執行,以非阻塞、事件驅動的方式高效處理資料。

JPA 項讀取器中支援查詢提示

在 5.1 版本之前,JPA 遊標和分頁項讀取器不支援查詢提示(例如 fetch size, timeout 等)。使用者需要提供一個自定義查詢提供者才能指定自定義提示。

在此版本中,JPA 讀取器及其各自的構建器已更新,以在定義要使用的 JPA 查詢時接受查詢提示。

JDBC 項讀取器中支援 Data Class

此版本在 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 更改為使用 SmartInitializingSingletonJobRegistryBeanPostProcessor 現已棄用,取而代之的是新新增的 JobRegistrySmartInitializingSingleton

下一步是什麼?

首先,感謝所有為此版本做出貢獻的人!對於 Spring Boot 使用者,可以透過 Spring Boot 3.4 獲取 Spring Batch 5.2。

我們期待您在 Github IssuesGithub DiscussionsTwitterStackOverflow 上提供反饋。

請注意:Spring Batch 5.1.x 將於 2024 年 11 月 22 日之後結束開源支援。因此,我鼓勵我們的使用者儘快將其應用升級到 Spring Batch 5.2.0。

Spring Batch 主頁|Github 原始碼|參考文件

訂閱 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

保持領先

VMware 提供培訓和認證,助您快速提升。

瞭解更多

獲取支援

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

瞭解更多

即將舉辦的活動

檢視 Spring 社群所有即將舉辦的活動。

檢視全部