取得領先
VMware 提供培訓和認證,以加速您的進度。
瞭解更多我很高興宣布 Spring Batch 5.2 的第二個里程碑版本現在可以從我們的里程碑版本庫取得。這篇部落格文章將帶您了解 Spring Batch 5.2 的主要變更。
如需完整的變更清單,請查看發布說明。
此版本引入了第一個 NoSQL Job Repository 實作,該實作由 MongoDB 支援。 與關聯式 Job Repository 實作類似,Spring Batch 提供了一個腳本來建立 MongoDB 中必要的集合,以便儲存和檢索批次元數據。
此實作需要 MongoDB 4 或更高版本,並且基於 Spring Data MongoDB。 為了使用此 Job Repository,您只需要定義一個 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 Job Repository 後,您可以像常規 Job Repository 一樣將其注入到任何 Job 或 Step 中。 您可以在 MongoDBJobRepositoryIntegrationTests 中找到完整的範例。
在 v5 中,基於記憶體 Map 的 Job Repository 實作由於多種原因而被移除。 Spring Batch 中唯一剩下的 Job Repository 實作是 JDBC 實作,它需要資料來源。 雖然這在使用 H2 或 HSQLDB 等記憶體資料庫時效果很好,但要求資料來源對於我們社群的許多過去使用 Map-based Repository 而無需任何額外依賴關係的使用者來說是一個強烈的限制。
在此版本中,我們引入了一個 JobRepository
實作,它不使用任何形式的批次元數據,也不將其儲存 (甚至不在記憶體中)。 它是一個 "NoOp" 實作,它丟棄批次元數據,並且不與任何資源交互 (因此得名 "無資源 Job Repository",它以 "無資源事務管理器" 命名)。
此實作旨在用於不需要可重啟性,並且執行上下文不以任何方式參與的情況 (例如透過執行上下文在步驟之間共享資料,或分區步驟,其中分區元數據透過執行上下文在管理器和工作人員之間共享等)。
此實作適用於在其自己的 JVM 中執行的一次性 Job。 它可以與事務性步驟 (配置了 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
適配到項目處理器的 FucntionItemProcessor
類似,此版本為其他 java.util.function
介面引入了幾個新的适配器,例如 Supplier
、Consumer
和 Predicate
。
新添加的适配器是:SupplierItemReader
、ConsumerItemWriter
和 PredicateFilteringItemProcessor
。 有關這些新适配器的更多詳細資訊,請參閱 org.springframework.batch.item.function 套件。
分階段事件驅動架構 (SEDA) 是一種強大的架構風格,用於在由佇列連接的階段中處理資料。 由於能夠將 Job 設計為步驟序列,因此這種風格直接適用於資料管道,並且可以在 Spring Batch 中輕鬆實現。
這裡唯一缺少的是如何讀取資料並將資料寫入中間佇列。 此版本引入了一個項目讀取器和項目寫入器,用於從 BlockingQueue
讀取資料並將資料寫入其中。 透過這兩個新類別,可以設計第一個在佇列中準備資料的步驟和第二個從同一個佇列使用資料的步驟。 透過這種方式,兩個步驟可以並行運行,以非阻塞、事件驅動的方式有效地處理資料。
我要感謝所有在此版本中發揮作用的貢獻者! 這個里程碑標誌著 5.2.0 的功能凍結版本。 我們將開始努力使此版本在即將到來的 5.2.0-RC1 中穩定,然後在 11 月推出 5.2.0 GA。
我們期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供您的意見。
請注意,5.1.x 將於 2024 年 11 月 22 日停止 OSS 支援。 因此,我鼓勵我們的使用者儘快開始計劃將他們的應用程式升級到 Spring Batch 5.2.0。