领先一步
VMware 提供培训和认证,助您快速发展。
了解更多我代表团队和所有贡献者很高兴地宣布,Spring Batch 5.1.0、5.0.4 和 4.3.10 版本现已在 Maven Central 仓库中发布。
5.0.4 和 4.3.10 版本是其各自先前补丁版本的直接替代品,并包含错误修复、文档改进和依赖项更新。您可以在发布说明中找到完整的更改列表:5.0.4 和 4.3.10。
这篇博客文章主要介绍 Spring Batch 5.1,它包含许多改进和新特性
JpaItemWriter
中的内存管理改进MongoItemReader
MongoItemWriter
中的批量插入支持JobRegistryBeanPostProcessor
的自动配置JobKeyGenerator
有关完整的更改列表,请查看发布说明。
此版本将 Spring 的依赖项升级到以下版本
支持 JDK 21 LTS 是 Spring Batch 5.1 的主要主题之一,特别是对 Project Loom 虚拟线程的支持。在此版本中,虚拟线程可用于框架的所有领域,例如使用虚拟线程运行并发步骤,或使用虚拟线程并行启动多个步骤。
得益于 Spring Batch 中精心设计的关注点分离,线程不是直接管理的。线程管理而是委托给 Spring Framework 的 TaskExecutor
实现。这种面向接口编程的方法允许您以透明灵活的方式在不同的 TaskExecutor
实现之间切换。
在 Spring Framework 6.1 中,引入了一种基于虚拟线程的新 TaskExecutor
实现,即 VirtualThreadTaskExecutor
。此 TaskExecutor
可在 Spring Batch 需要 TaskExecutor
的任何地方使用。以下示例展示了如何使用虚拟线程配置多线程步骤
@Bean
public VirtualThreadTaskExecutor taskExecutor() {
return new VirtualThreadTaskExecutor("spring-batch-");
}
@Bean
public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager,
ItemReader<Integer> itemReader, ItemWriter<Integer> itemWriter,
VirtualThreadTaskExecutor taskExecutor) {
return new StepBuilder("step", jobRepository).<Integer, Integer>chunk(2, transactionManager)
.reader(itemReader)
.writer(itemWriter)
.taskExecutor(taskExecutor)
.build();
}
使用 JpaItemWriter
时,如果块大小足够大,JPA 持久化上下文可能会迅速增长。如果未能及时恰当地清除,这可能会导致 OutOfMemoryError
错误。
在此里程碑版本中,JpaItemWriter
中引入了一个名为 clearPersistenceContext
的新选项,用于在写入每个项目块后清除持久化上下文。此选项改进了处理大量数据并配置了较大块大小的面向块步骤的内存管理。
直到 5.0 版本,Spring Batch 提供了两个装饰器 SynchronizedItemStreamReader
和 SynchronizedItemStreamWriter
来同步线程对 ItemStreamReader#read
和 ItemStreamWriter#write
的访问。这些装饰器在多线程步骤中使用非线程安全的 Item Streams 时非常有用。
虽然这些装饰器适用于 ItemStream
实现,但它们不能用于非 Item Streams。例如,这些装饰器不能用于同步对 ListItemReader#read
或 KafkaItemWriter#write
的访问。
为了方便用户,此版本还为非 Item Streams 引入了新的装饰器。借助此新功能,Spring Batch 中的所有 Item Reader 和 Writer 现在都可以同步,而无需编写自定义装饰器。
直到 5.0 版本,Spring Batch 提供的 MongoItemReader
使用分页,这是基于 MongoDB 的 skip
操作。虽然这对小型/中型数据集效果很好,但对于大型数据集,其性能开始变差。
此版本引入了 MongoCursorItemReader
,这是一个新的基于游标的 MongoDB Item Reader。此实现使用游标而不是分页来从 MongoDB 读取数据,这改进了对大型集合的读取性能。
为了与其他基于游标/分页的 Reader 保持一致,当前的 MongoItemReader
已重命名为 MongoPagingItemReader
。
直到 5.0 版本,MongoItemWriter
支持两种操作:upsert
和 delete
。虽然 upsert
操作对于插入和更新都效果很好,但对于目标集合中已知为新的项目,其性能不佳。
与 JpaItemWriter
中的 persist
和 merge
操作类似,此版本在 MongoItemWriter
中添加了一个名为 insert
的新操作,该操作专为批量插入设计。对于新项目,此新选项的性能优于 upsert
,因为它不需要额外的查找来检查目标集合中是否存在项目。
在 Spring Batch 的上下文中,使用 Redis 的一个典型场景是在作业执行之前/之后使用参考数据填充/清除缓存。这是一种常见的性能改进模式,用于从缓存查询数据,而不是在作业执行期间向主数据库发出多次查询。
在此版本中,基于 Spring Data Redis 的新 RedisItemReader
和 RedisItemWriter
已引入内置 Item Reader 和 Writer 库中。可以通过 ScanOptions
配置 Reader 以扫描要从 Redis 读取的键集。可以通过 RedisTemplate
配置 Writer 以将项目写入 Redis。
在 Spring Batch 应用程序中配置 JobOperator
时,需要在操作员的 JobRegistry
中注册作业。此注册过程可以手动完成,也可以通过将 JobRegistryBeanPostProcessor
bean 添加到应用程序上下文中来自动完成。
在此版本中,Spring Batch 的默认配置(即使用 @EnableBatchProcessing
或扩展 DefaultBatchConfiguration
时)现在会自动在应用程序上下文中注册一个 JobRegistryBeanPostProcessor
bean。这简化了配置过程,并改善了使用 JobOperator
时的用户体验。
使用 XML 配置样式时,可以通过 decision
元素以决策开始作业流程。但是,直到 5.0 版本,使用 Java API 无法实现相同的流程定义。
此版本为 JobBuilder
API 添加了一个新选项,以便使用 JobExecutionDecider
开始作业流程。这使得两种配置样式更加一致。
默认情况下,Spring Batch 通过计算标识性作业参数的哈希值来识别作业实例。虽然不太可能需要自定义此识别过程,但 Spring Batch 仍然为用户提供了策略接口,通过 JobKeyGenerator
API 覆盖默认机制。
直到 5.0 版本,如果不创建自定义的 JobRepository
和 JobExplorer
,则无法提供自定义键生成器。在此版本中,现在可以通过 JobRepository
和 JobExplorer
的工厂 bean 提供自定义的 JobKeyGenerator
。
此特性引入了由 MongoDB 支持的新的 JobRepository
和 JobExplorer
实现。这个期待已久的特性现已作为实验性功能提供,标志着 Spring Batch 第一个 NoSQL 元数据存储的引入。
此特性引入了一个复合 ItemReader
实现。与 CompositeItemProcessor
和 CompositeItemWriter
类似,其思想是将读取依次委托给 Item Reader 列表。当需要从不同来源(文件、数据库等)读取具有相同格式的数据时,这非常有用。
参考文档已更新为使用 Antora。此更新引入了许多改进,包括但不限于
您可以在此处查看新文档版本。
入门指南已经存在很长时间了,很好地展示了如何将 Spring Batch 与 Spring Boot 一起使用。然而,并非所有用户都是 Spring Boot 用户,其中一个常见需求是提供使用纯 Spring Batch 的相同入门体验。
因此,我们引入了一个新的两分钟教程,提供了创建 Spring Batch 项目和实现简单“Hello world”作业的分步指南。这应该能改善非 Boot 用户的入门体验。话虽如此,当前的基于 Spring Boot 的指南已更新到最新的 Spring Boot 3 版本,以展示如何在 Spring Batch 5 中使用 Java Records 支持等新特性。
在此版本中,我们重写了示例集中的所有代码示例。示例现在按功能组织在单独的包中。这使您更容易理解和学习 Spring Batch 中的特定功能。主 README
文件包含一个表格,显示了可用的示例及其涵盖的功能:Spring Batch 示例。
此外,每个示例现在都有自己的 README
文件,详细解释了示例并提供了运行说明。现在可以从 IDE 或命令行将示例作为单元测试运行,以获得“克隆并运行”体验。有了新的结构,您只需两个命令即可在本地环境中运行 Spring Batch 示例!
最后,大多数示例现在采用两种 Spring 配置样式实现:Java 配置样式和 XML 配置样式。这使您可以更轻松地比较这两种配置样式,并有助于您将 XML 配置迁移到 Java 配置。
正如在尝试新项目或为现有项目贡献代码时拥有良好的用户体验很重要一样,我们认为在报告问题时拥有良好的体验同样重要。因此,作为“改进入门体验”主题的一部分,我们重写了问题报告流程,提供了一份关于如何报告问题的分步指南:问题报告指南。
新指南包含一个项目模板,其中包含一个最小的、完整的、可验证的示例,该示例可与嵌入式数据源一起使用。此模板是您根据需要进行编辑以重现问题的起点。该指南还为涉及非嵌入式数据库(如 PostgreSQL 或 MySQL)的问题提供了 Docker + TestContainers 模板。
首先,我要感谢为此版本做出贡献的所有人员!Spring Batch 5.1.0 随附 Spring Boot 3.2.0。
我们期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供反馈。