|
对于最新稳定版本,请使用Spring Batch Documentation 6.0.0! |
春季第5.2期有什么新内容
本节重点介绍了Spring Batch5.2中的主要变更。完整变更列表请参阅发布说明。
Spring Batch5.2包含以下功能:
依赖升级
在本版本中,Spring依赖升级至以下版本:
-
Spring Framework 6.2.0
-
Spring Integration 6.4.0
-
春季数据 3.4.0
-
春季重试 2.0.10
-
春季LDAP 3.2.8
-
春季AMQP 3.2.0
-
春季卡夫卡 3.3.0
-
测距仪 1.14.1
MongoDB 作业仓库支持
本版本引入了首个由 MongoDB 支持的 NoSQL 作业仓库实现。类似于关系型作业仓库实现,Spring Batch 附带一个脚本用于创建MongoDB 中保存和检索批处理元数据所需的集合。
该实现需要 MongoDB 4 版或更高版本,基于 Spring Data MongoDB。要使用该作业仓库,只需定义一个Mongo模板以及一个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 上运行良好,但对数据源的要求是一个强烈的限制对于我们社区中许多曾经使用基于 Map 的仓库且没有额外依赖的用户来说。
在本版本中,我们引入了JobRepository实现不使用或存储任何形式的批处理元数据(甚至不存储在内存中)。这是一个“无作”实现,丢弃批处理元数据,不与任何资源交互(因此得名“无资源作业仓库”,源自“无资源事务管理器”)。
该实现适用于不需要重启且不涉及执行上下文的用例任何形式的(例如通过执行上下文在步骤间共享数据,或分区步骤中分区的元数据通过执行上下文在管理者和工人之间共享等)。
该实现适用于在各自JVM中执行的一次性作业。它支持事务步骤(配置为 一个DataSourceTransactionManager例如)以及非事务步骤(配置为ResourcelessTransactionManager). 该实现不支持线程安全,不应在任何并发环境中使用。
复合题目阅读器的实现
类似于CompositeItemProcessor和合成项目作家,我们引入一个新的复合项目阅读器实现
该系统旨在从多个格式相同来源顺序读取数据。这在数据传播时非常有用
在不同资源中,或者编写自定义阅读器并不是一个选项。
一个复合项目阅读器类似于其他复合伪物,通过将读取作委托给常规项目读取器来实现
挨次。这里有一个快速示例,展示了复合读取器从平面文件读取数据,再从数据库表读取数据:
@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 的新适配器
似功能项处理器该应用改接了java.util.function.函数对Item processing者而言,此释放
引入了多种新的适配器,适用于其他java.util.function像这样的接口提供商,消费者和谓语.
新加入的适配器有:提供商ItemReader,消费者物品作家和谓词过滤项目处理器.
有关这些新适配器的更多细节,请参阅 org.springframework.batch.item.function 包。
与阻塞队列项目读写并发步骤
分阶段事件驱动架构(SEDA)是一种 强大的架构风格,通过队列分阶段处理数据。这种风格直接适用于数据 pipelines,并且在Spring Batch中可以轻松实现,得益于将作业设计成一系列步骤。
这里唯一缺少的部分是如何从中间队列读取和写入数据。本版本引入了ItemReader
以及用于读取数据并写入阻塞队列.有了这两个新职业,可以设计出第一步
该步骤负责准备队列中的数据,第二步则消耗同一队列中的数据。这样,两个步骤可以同时运行
以非阻塞、事件驱动的方式高效处理数据。
JPA 项目阅读器中的查询提示支持
直到5.1版本,JPA光标和分页项目阅读器不支持查询提示(如取指大小、超时等)。 用户需要提供自定义查询工具以指定自定义提示。
在本版本中,JPA读者及其相关构建者更新为在定义JPA查询时接受查询提示。
JDBC题目阅读器中的数据类支持
本版本在 JDBC 光标和分页项目阅读器构建器中引入了一种新方法,允许用户指定DataClassRowMapper当项目类型为数据类(Java记录或Kotlin数据类)时。
新方法名为dataRowMapper(TargetType.class)与beanRowMapper(TargetType.class)并且被设计成
使行映射器的配置在常规类(Java豆)和数据类(Java记录)之间保持一致。
RecursiveCollectionLineAggregator 中的可配置行分隔器
直到现在,线分隔子的性质在递归集合线汇总器设置为系统的行分隔符值。
虽然可以通过系统属性更改值,但这种配置风格与其他属性不一致
批次工件。
此次发布引入了一名新的二传手递归集合线汇总器允许用户配置自定义值
无需使用系统属性即可实现行分隔器。
职位注册改进
在5.1版本中,批处理基础设施豆的默认配置被更新为自动填充作业注册表
通过定义一个JobRegistryBeanPostProcessor在应用语境中。在春季框架最近的变更之后
这改变了日志水平豆后处理检查器,与JobRegistryBeanPostProcessor是
记录在典型的Spring Batch应用中。这些警告是由于JobRegistryBeanPostProcessor依赖
转给职位注册豆子,不推荐,可能会引发豆子生命周期问题。
这些问题在本版本中已通过改变填充机制得到解决职位注册从使用豆子后处理器到使用一个SmartInitializingSingleton.这JobRegistryBeanPostProcessor现已弃用,取而代之的是新加入的JobRegistrySmartInitializingSingleton.