領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多很高興地宣佈,Spring Batch 5.2 的第二個里程碑版本現已透過我們的里程碑倉庫提供。這篇博文將引導您瞭解 Spring Batch 5.2 的主要變更。
有關完整的變更列表,請檢視 釋出說明。
此版本引入了第一個基於 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 適配為項處理器(item processor)的 FucntionItemProcessor 類似,此版本為其他 java.util.function 介面(如 Supplier、Consumer 和 Predicate)引入了幾個新的介面卡。
新新增的介面卡包括:SupplierItemReader、ConsumerItemWriter 和 PredicateFilteringItemProcessor。有關這些新介面卡的更多詳細資訊,請參閱 org.springframework.batch.item.function 包。
分階段事件驅動架構 (SEDA) 是一種強大的架構風格,用於處理由佇列連線的各個階段的資料。這種風格直接適用於資料管道,並且由於 Spring Batch 能夠將作業設計為一系列步驟,因此可以輕鬆實現。
這裡唯一缺失的部分是如何讀寫中間佇列的資料。此版本引入了一個項讀取器和項寫入器,用於從 BlockingQueue 讀取資料並寫入其中。藉助這兩個新類,可以設計第一個準備佇列中資料的步驟,以及第二個從同一佇列消耗資料的步驟。這樣,這兩個步驟就可以併發執行,以非阻塞、事件驅動的方式高效地處理資料。
我想感謝所有為此版本做出貢獻的貢獻者!這個里程碑標誌著 5.2.0 的功能凍結版本。我們將在即將到來的 5.2.0-RC1 和 5.2.0 GA 版本(將於 11 月釋出)中開始使此版本穩定。
我們期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供反饋。
請注意,5.1.x 版本將於 2024 年 11 月 22 日停止 OSS 支援。因此,我鼓勵使用者在 Spring Batch 5.2.0 釋出後儘快規劃將其應用程序升級到該版本。