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
.