Spring Batch 5.2.0-M2 現已可用!

版本釋出 | Mahmoud Ben Hassine | 2024年10月11日 | ...

我很高興地宣佈 Spring Batch 5.2 的第二個里程碑版本現已在我們里程碑倉庫中可用。這篇部落格文章將向您介紹 Spring Batch 5.2 的主要變更。

  • 支援 MongoDB 作業倉庫
  • 新的無資源作業倉庫
  • 複合項讀取器實現
  • 用於 java.util.function API 的新介面卡
  • 使用阻塞佇列項讀取器和寫入器的併發步驟

有關完整的更改列表,請檢視釋出說明

支援 MongoDB 作業倉庫

此版本引入了第一個 NoSQL 作業倉庫實現,它由 MongoDB 支援。類似於關係型作業倉庫實現,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 適配到項處理器的 FucntionItemProcessor,此版本為其他 java.util.function 介面(如 SupplierConsumerPredicate)引入了幾個新介面卡。

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

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

分階段事件驅動架構 (SEDA) 是一種強大的架構風格,用於在由佇列連線的階段中處理資料。這種風格直接適用於資料管道,並且得益於將作業設計為一系列步驟的能力,可以輕鬆地在 Spring Batch 中實現。

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

接下來是什麼?

我要感謝所有為本次釋出做出貢獻的人!這個里程碑版本標誌著 5.2.0 的功能凍結。我們將在接下來的 5.2.0-RC1 和 11 月的 5.2.0 GA 版本中致力於使此版本穩定。

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

請注意,5.1.x 將於 2024 年 11 月 22 日停止 OSS 支援。因此,我鼓勵我們的使用者計劃在 Spring Batch 5.2.0 釋出後儘快將其應用程序升級到該版本。

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

獲取 Spring 新聞郵件

訂閱 Spring 新聞郵件,保持聯絡

訂閱

搶佔先機

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲取支援

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

瞭解更多

即將到來的活動

檢視 Spring 社群所有即將到來的活動。

檢視全部