Spring Batch 5.2 中的新增功能

依赖项升级

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

MongoDB 作业存储库支持

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

此实现需要MongoDB版本4或更高版本,并且基于Spring Data MongoDB。 为了使用此作业存储库,您需要做的就是定义一个MongoTemplateMongoTransactionManager新添加的MongoJobRepositoryFactoryBean:spring-doc.cadn.net.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.cadn.net.cn

新的无资源作业存储库

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

在此版本中,我们引入了JobRepository不以任何形式使用或存储批处理元数据的实现 (甚至不是内存中)。它是一个“NoOp”实现,它丢弃了批量元数据,并且不与任何资源交互 (因此得名“无资源作业存储库”,以“无资源事务管理器”命名)。spring-doc.cadn.net.cn

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

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

复合项读取器实现

类似于CompositeItemProcessorCompositeItemWriter,我们引入了一个新的CompositeItemReader实现 旨在从具有相同格式的多个源按顺序读取数据。这在数据传播时很有用 在不同的资源上,编写自定义阅读器不是一种选择。spring-doc.cadn.net.cn

一个CompositeItemReader与其他复合工件一样,通过将读取作委托给常规项目读取器 挨次。这是一个快速示例,显示了一个复合读取器,它从平面文件中读取人员数据,然后从数据库表中读取人员数据:spring-doc.cadn.net.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 的新适配器

FucntionItemProcessor它适应了java.util.function.Function到物品处理器,此版本 为其他java.util.functionSupplier,ConsumerPredicate.spring-doc.cadn.net.cn

新添加的适配器是:SupplierItemReader,ConsumerItemWriterPredicateFilteringItemProcessor. 有关这些新适配器的更多详细信息,请参阅 org.springframework.batch.item.function 包。spring-doc.cadn.net.cn

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

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

这里唯一缺少的是如何从中间队列读取数据和向中间队列写入数据。此版本引入了项目阅读器 和项目写入器,用于从中读取数据并将其写入BlockingQueue.有了这两个新类,就可以设计第一步了 准备队列中的数据,以及使用同一队列中的数据的第二步。这样,这两个步骤就可以同时运行 以非阻塞、事件驱动的方式高效处理数据。spring-doc.cadn.net.cn

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

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

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

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

此版本在 JDBC 游标和分页项阅读器的构建器中引入了一种新方法,允许用户指定DataClassRowMapper当项目类型是数据类(Java 记录或 Kotlin 数据类)时。spring-doc.cadn.net.cn

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

RecursiveCollectionLineAggregator 中的可配置行分隔符

到目前为止,行分隔符属性RecursiveCollectionLineAggregator设置为系统的行分隔符值。 虽然可以通过系统属性更改值,但此配置样式与其他属性不一致 批处理工件。spring-doc.cadn.net.cn

此版本在RecursiveCollectionLineAggregator允许用户配置自定义值 行分隔符,而无需使用系统属性。spring-doc.cadn.net.cn

作业注册改进

在 V5.1 中,批处理基础架构 Bean 的默认配置已更新为自动填充作业注册表 通过定义一个JobRegistryBeanPostProcessorbean 的 bean 中。在 Spring Framework 最近发生更改后 这更改了BeanPostProcessorChecker,与JobRegistryBeanPostProcessor是 登录到典型的 Spring Batch 应用程序中。这些警告是由于JobRegistryBeanPostProcessor有依赖关系 设置为JobRegistrybean,不推荐这样做,可能会导致 bean 生命周期问题。spring-doc.cadn.net.cn

此版本中已通过更改填充JobRegistry从使用BeanPostProcessor使用SmartInitializingSingleton.这JobRegistryBeanPostProcessor现在已被弃用,取而代之的是新添加的JobRegistrySmartInitializingSingleton.spring-doc.cadn.net.cn