保持领先
VMware 提供培训和认证,助您快速提升。
了解更多我代表团队和所有贡献者高兴地宣布,Spring Batch 5.2 现已在 Maven Central 全面可用。这篇博文将引导您了解此版本中的主要新增功能。有关完整的更改列表,请参阅发布说明。
此版本的主要亮点如下
在此版本中,Spring 依赖项已升级到以下版本
此版本引入了第一个由 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 适配为项处理器的 FunctionItemProcessor 类似,此版本为其他 java.util.function 接口(如 Supplier、Consumer 和 Predicate)引入了几个新的适配器。
新添加的适配器包括:SupplierItemReader、ConsumerItemWriter 和 PredicateFilteringItemProcessor。有关这些新适配器的更多详细信息,请参阅 org.springframework.batch.item.function 包。
分阶段事件驱动架构 (SEDA) 是一种强大的架构风格,用于通过队列连接的阶段处理数据。由于 Spring Batch 能够将作业设计为一系列步骤,这种风格可以直接应用于数据管道并易于实现。
这里唯一缺少的部分是如何从中间队列读取数据并写入数据。此版本引入了一个项读取器和一个项写入器,用于从 BlockingQueue 读取数据并写入数据。通过这两个新类,可以设计第一个步骤将数据准备到队列中,然后设计第二个步骤从同一队列消费数据。这样,两个步骤可以并发运行,以非阻塞、事件驱动的方式高效处理数据。
在 5.1 版本之前,JPA 游标和分页项读取器不支持查询提示(例如 fetch size, timeout 等)。用户需要提供一个自定义查询提供者才能指定自定义提示。
在此版本中,JPA 读取器及其各自的构建器已更新,以在定义要使用的 JPA 查询时接受查询提示。
此版本在 JDBC 游标和分页项读取器的构建器中引入了一个新方法,允许用户在项类型是 data class(Java record 或 Kotlin data class)时指定 DataClassRowMapper。
新方法 dataRowMapper(TargetType.class) 与 beanRowMapper(TargetType.class) 类似,旨在使常规类(Java bean)和 data class(Java record)之间的行映射器配置保持一致。
在 5.1 版本中,批处理基础设施 bean 的默认配置已更新,通过在应用上下文中定义 JobRegistryBeanPostProcessor bean 来自动填充作业注册表。最近 Spring Framework 中更改 BeanPostProcessorChecker 日志级别的一项更新后,典型 Spring Batch 应用中记录了与 JobRegistryBeanPostProcessor 相关的几个警告。这些警告是由于 JobRegistryBeanPostProcessor bean 依赖于 JobRegistry bean,这不推荐,并可能导致 bean 生命周期问题。
这些问题在此版本中得到了解决,通过将填充 JobRegistry 的机制从使用 BeanPostProcessor 更改为使用 SmartInitializingSingleton。JobRegistryBeanPostProcessor 现已弃用,取而代之的是新添加的 JobRegistrySmartInitializingSingleton。
首先,感谢所有为此版本做出贡献的人!对于 Spring Boot 用户,可以通过 Spring Boot 3.4 获取 Spring Batch 5.2。
我们期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供反馈。
请注意:Spring Batch 5.1.x 将于 2024 年 11 月 22 日之后结束开源支持。因此,我鼓励我们的用户尽快将其应用升级到 Spring Batch 5.2.0。