Spring Batch 5.2.0-M2 現已推出!

發布 | Mahmoud Ben Hassine | 2024 年 10 月 11 日 | ...

我很高興宣布 Spring Batch 5.2 的第二個里程碑版本現在可以從我們的里程碑版本庫取得。這篇部落格文章將帶您了解 Spring Batch 5.2 的主要變更。

  • MongoDB Job Repository 支援
  • 新的無資源 Job Repository
  • 複合項目讀取器實作
  • java.util.function API 的新适配器
  • 具有阻塞佇列項目讀取器和寫入器的並行步驟

如需完整的變更清單,請查看發布說明

MongoDB Job Repository 支援

此版本引入了第一個 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 中找到完整的範例。

新的無資源 Job Repository

在 v5 中,基於記憶體 Map 的 Job Repository 實作由於多種原因而被移除。 Spring Batch 中唯一剩下的 Job Repository 實作是 JDBC 實作,它需要資料來源。 雖然這在使用 H2 或 HSQLDB 等記憶體資料庫時效果很好,但要求資料來源對於我們社群的許多過去使用 Map-based Repository 而無需任何額外依賴關係的使用者來說是一個強烈的限制。

在此版本中,我們引入了一個 JobRepository 實作,它不使用任何形式的批次元數據,也不將其儲存 (甚至不在記憶體中)。 它是一個 "NoOp" 實作,它丟棄批次元數據,並且不與任何資源交互 (因此得名 "無資源 Job Repository",它以 "無資源事務管理器" 命名)。

此實作旨在用於不需要可重啟性,並且執行上下文不以任何方式參與的情況 (例如透過執行上下文在步驟之間共享資料,或分區步驟,其中分區元數據透過執行上下文在管理器和工作人員之間共享等)。

此實作適用於在其自己的 JVM 中執行的一次性 Job。 它可以與事務性步驟 (配置了 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) 是一種強大的架構風格,用於在由佇列連接的階段中處理資料。 由於能夠將 Job 設計為步驟序列,因此這種風格直接適用於資料管道,並且可以在 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 社群中所有即將舉行的活動。

查看全部