Spring Batch 5.2 中的新增功能
本节重点介绍 Spring Batch 5.2 中的主要变化。有关更改的完整列表,请参阅发行说明。
Spring Batch 5.2 包括以下功能:
依赖项升级
在此版本中,Spring 依赖项已升级到以下版本:
-
Spring 框架 6.2.0
-
Spring 集成 6.4.0
-
Spring Data 3.4.0
-
春季重试 2.0.10
-
弹簧 LDAP 3.2.8
-
Spring AMQP 3.2.0
-
春季卡夫卡 3.3.0
-
千分尺 1.14.1
MongoDB 作业存储库支持
此版本引入了第一个由 MongoDB 支持的 NoSQL 作业存储库实现。 与关系作业存储库实现类似,Spring Batch 附带了一个脚本来创建 MongoDB 中必要的集合,以便保存和检索批量元数据。
此实现需要MongoDB版本4或更高版本,并且基于Spring Data MongoDB。
为了使用此作业存储库,您需要做的就是定义一个MongoTemplate
和MongoTransactionManager
新添加的MongoJobRepositoryFactoryBean
:
@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 等内存数据库,但需要数据源是一个很强的限制 对于我们社区的许多用户来说,他们曾经使用基于地图的存储库,没有任何额外的依赖关系。
在此版本中,我们引入了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 API 的新适配器
似FucntionItemProcessor
它适应了java.util.function.Function
到物品处理器,此版本
为其他java.util.function
像Supplier
,Consumer
和Predicate
.
新添加的适配器是:SupplierItemReader
,ConsumerItemWriter
和PredicateFilteringItemProcessor
.
有关这些新适配器的更多详细信息,请参阅 org.springframework.batch.item.function 包。
具有阻塞队列项读取器和写入器的并发步骤
分阶段事件驱动架构 (SEDA) 是一个 强大的架构风格,可分阶段处理由队列连接的数据。此样式直接适用于数据 管道,并且由于能够将作业设计为一系列步骤,因此很容易在 Spring Batch 中实现。
这里唯一缺少的是如何从中间队列读取数据和向中间队列写入数据。此版本引入了一个项目读取器和项目写入器,用于从中读取数据并将其写入BlockingQueue
. 有了这两个新类,人们可以设计第一步准备队列中的数据,以及使用同一队列中的数据的第二步。这样,这两个步骤可以同时运行以非阻塞、事件驱动的方式有效地处理数据。
JPA 项目阅读器中的查询提示支持
在 5.1 版之前,JPA 游标和分页项阅读器不支持查询提示(如获取大小、超时等)。用户需要提供自定义查询提供程序才能指定自定义提示。
在此版本中,JPA 读取器及其各自的构建器已更新,以便在定义要使用的 JPA 查询时接受查询提示。
JDBC 项读取器中的数据类支持
此版本在 JDBC 游标和分页项阅读器的构建器中引入了一种新方法,允许用户指定DataClassRowMapper
当项目类型是数据类(Java 记录或 Kotlin 数据类)时。
名为dataRowMapper(TargetType.class)
类似于beanRowMapper(TargetType.class)
并且被设计
使行映射器的配置在常规类(Java bean)和数据类(Java 记录)之间保持一致。
RecursiveCollectionLineAggregator 中的可配置行分隔符
到目前为止,行分隔符属性RecursiveCollectionLineAggregator
设置为系统的行分隔符值。
虽然可以通过系统属性更改值,但此配置样式与其他属性不一致
批处理工件。
此版本在RecursiveCollectionLineAggregator
允许用户配置自定义值
行分隔符,而无需使用系统属性。
作业注册改进
在 V5.1 中,批处理基础架构 Bean 的默认配置已更新为自动填充作业注册表
通过定义一个JobRegistryBeanPostProcessor
bean 的 bean 中。在 Spring Framework 最近发生更改后
这更改了BeanPostProcessorChecker
,与JobRegistryBeanPostProcessor
是
登录到典型的 Spring Batch 应用程序中。这些警告是由于JobRegistryBeanPostProcessor
有依赖关系
设置为JobRegistry
bean,不推荐这样做,可能会导致 bean 生命周期问题。
此版本中已通过更改填充JobRegistry
从使用BeanPostProcessor
使用SmartInitializingSingleton
.这JobRegistryBeanPostProcessor
现在已被弃用,取而代之的是新添加的JobRegistrySmartInitializingSingleton
.