Spring Batch 5.2 中的新增功能

依赖项升级

在此版本中,Spring 依赖项升级到以下版本:spring-doc.cn

MongoDB 作业存储库支持

此版本引入了第一个由 MongoDB 支持的 NoSQL 作业存储库实现。 与关系作业存储库实现类似, Spring Batch 附带了一个脚本来创建 MongoDB 中必要的集合,以便保存和检索批量元数据。spring-doc.cn

此实现需要 MongoDB 版本 4 或更高版本,并且基于 Spring Data MongoDB。 为了使用此作业存储库,您需要做的就是定义新添加的 :MongoTemplateMongoTransactionManagerMongoDBJobRepositoryFactoryBeanspring-doc.cn

@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 中找到完整的示例。spring-doc.cn

新的无资源作业存储库

在 v5 中,出于多种原因,删除了内存中基于 Map 的作业存储库实现。 Spring Batch 中唯一剩下的作业存储库实现是 JDBC 实现,它需要一个数据源。 虽然这适用于 H2 或 HSQLDB 等内存数据库,但需要数据源是一个强大的限制 对于我们社区的许多用户,他们过去使用基于 Map 的存储库,而没有任何额外的依赖项。spring-doc.cn

在此版本中,我们引入了一种不以任何形式使用或存储批量元数据的实现 (甚至不在内存中)。它是一个 “NoOp” 实现,丢弃批处理元数据,不与任何资源交互 (因此得名 “resourceless job repository”,它以 “resourceless transaction manager” 命名)。JobRepositoryspring-doc.cn

此实现适用于不需要可重启性且不涉及执行上下文的用例 以任何方式(例如通过执行上下文在步骤之间共享数据,或分区元数据所在的分区步骤 通过 execution context 在 Manager 和 worker 之间共享,等等)。spring-doc.cn

此实现适用于在自己的 JVM 中执行的一次性作业。它适用于事务步骤(配置了 a 以及非事务性步骤(使用 a 配置)。 该实现不是线程安全的,不应在任何并发环境中使用。DataSourceTransactionManagerResourcelessTransactionManagerspring-doc.cn

Composite Item Reader 实现

与 和 类似,我们引入了一个新的实现 ,该 API 旨在从具有相同格式的多个源中按顺序读取数据。这在数据分布时非常有用 并编写自定义读取器不是一种选择。CompositeItemProcessorCompositeItemWriterCompositeItemReaderspring-doc.cn

A 的工作方式与其他复合工件类似,通过将读取操作委托给常规项目读取器 挨次。下面是一个快速示例,显示了一个复合读取器,该读取器从平面文件中读取 people 数据,然后从数据库表中读取 people:CompositeItemReaderspring-doc.cn

@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 的新适配器

与此类似 适应 物品处理器,此版本 为其他接口(如 和 )引入了几个新的适配器。FucntionItemProcessorjava.util.function.Functionjava.util.functionSupplierConsumerPredicatespring-doc.cn

新添加的适配器包括: 和 . 关于这些新适配器的更多细节,请参考 org.springframework.batch.item.function 包。SupplierItemReaderConsumerItemWriterPredicateFilteringItemProcessorspring-doc.cn

具有阻止队列项目读取器和写入器的并发步骤

分阶段事件驱动架构 (SEDA) 是一种 强大的架构风格,可在队列连接的阶段中处理数据。此样式直接适用于数据 管道,并且由于能够将作业设计为一系列步骤,因此在 Spring Batch 中很容易实现。spring-doc.cn

这里唯一缺少的部分是如何将数据读取和写入中间队列。此版本引入了项目读取器 和 item writer 读取数据并将其写入 .有了这两个新类,人们可以设计第一步 ,在队列中准备数据,第二个步骤使用来自同一队列的数据。这样,两个步骤可以同时运行 以无阻塞、事件驱动的方式高效处理数据。BlockingQueuespring-doc.cn

JPA 项目读取器中的查询提示支持

在版本 5.1 之前,JPA 游标和分页项读取器不支持查询提示(如获取大小、超时等)。 用户需要提供自定义查询提供程序才能指定自定义提示。spring-doc.cn

在此版本中,JPA 读取器及其各自的生成器已更新为在定义要使用的 JPA 查询时接受查询提示。spring-doc.cn

JDBC 项读取器中的数据类支持

此版本在 JDBC 游标和分页项读取器的构建器中引入了一种新方法,该方法允许用户指定项的类型何时为数据类(Java 记录或 Kotlin 数据类)。DataClassRowMapperspring-doc.cn

名为 的新方法类似于 和 被设计 使行映射器的配置在常规类 (Java bean) 和数据类 (Java 记录) 之间保持一致。dataRowMapper(TargetType.class)beanRowMapper(TargetType.class)spring-doc.cn

RecursiveCollectionLineAggregator 中的可配置行分隔符

到目前为止,line separator 属性 in 被设置为 System 的 line separator 值。 虽然可以通过 System 属性更改值,但此配置样式与其他属性不一致 的批处理工件。RecursiveCollectionLineAggregatorspring-doc.cn

该版本引入了一个新的 setter,允许用户配置 行分隔符,而无需使用 System 属性。RecursiveCollectionLineAggregatorspring-doc.cn

作业登记改进

在版本 5.1 中,更新了批处理基础结构 bean 的默认配置以自动填充作业注册表 通过在应用程序上下文中定义 Bean。在 Spring Framework 最近的更改之后 中更改了日志级别,与 WERE 相关的几个警告 登录到典型的 Spring Batch 应用程序。这些警告是由于具有依赖项 添加到 Bean,不建议这样做,这可能会导致 Bean 生命周期问题。JobRegistryBeanPostProcessorBeanPostProcessorCheckerJobRegistryBeanPostProcessorJobRegistryBeanPostProcessorJobRegistryspring-doc.cn

在此版本中,通过将填充机制从使用 a 更改为使用 .现已弃用,取而代之的是新添加的 .JobRegistryBeanPostProcessorSmartInitializingSingletonJobRegistryBeanPostProcessorJobRegistrySmartInitializingSingletonspring-doc.cn