抢先一步
VMware 提供培训和认证,以加速您的进步。
了解更多我很高兴地宣布,Spring Batch 5.2 的第二个里程碑版本现已从我们的里程碑存储库中提供。这篇博文将引导您了解 Spring Batch 5.2 中的主要更改。
有关完整更改列表,请查看 发行说明。
此版本引入了第一个 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 中,基于内存映射的作业存储库实现由于多种原因而被移除。Spring Batch 中唯一剩下的作业存储库实现是 JDBC 实现,它需要一个数据源。虽然这在 H2 或 HSQLDB 等内存数据库中运行良好,但需要数据源对我们社区的许多用户来说是一个很大的限制,他们过去习惯于在没有任何额外依赖项的情况下使用基于映射的存储库。
在此版本中,我们引入了一个 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()));
}
类似于 FucntionItemProcessor
将 java.util.function.Function
适配到项处理器,此版本为其他 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 和 11 月的 5.2.0 GA 中开始努力使此版本稳定。
我们期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供反馈。
请注意,5.1.x 将于 2024 年 11 月 22 日停止 OSS 支持。因此,我鼓励我们的用户开始计划尽快将其应用程序升级到 Spring Batch 5.2.0 发布后。