Spring Batch 5.1 GA、5.0.4 和 4.3.10 现已发布!

发布 | Mahmoud Ben Hassine | 2023 年 11 月 23 日 | ...

我代表团队和所有贡献者很高兴地宣布,Spring Batch 5.1.0、5.0.4 和 4.3.10 版本现已在 Maven Central 仓库中发布。

5.0.4 和 4.3.10 版本是其各自先前补丁版本的直接替代品,并包含错误修复、文档改进和依赖项更新。您可以在发布说明中找到完整的更改列表:5.0.44.3.10

这篇博客文章主要介绍 Spring Batch 5.1,它包含许多改进和新特性

  • 依赖项升级
  • 虚拟线程支持
  • JpaItemWriter 中的内存管理改进
  • 用于 Item Reader 和 Writer 的新同步装饰器
  • 新的基于游标的 MongoItemReader
  • MongoItemWriter 中的批量插入支持
  • 用于 Redis 的新 Item Reader 和 Writer
  • JobRegistryBeanPostProcessor 的自动配置
  • 能够以决策开始作业流程
  • 能够提供自定义的 JobKeyGenerator
  • MongoDB Job Repository (实验性)
  • 复合 Item Reader (实验性)
  • 基于 Antora 的新文档
  • 改进的示例
  • 增强的问题报告指南

有关完整的更改列表,请查看发布说明

依赖项升级

此版本将 Spring 的依赖项升级到以下版本

  • Spring Framework 6.1.0
  • Spring Integration 6.2.0
  • Spring Data 3.2.0
  • Spring Kafka 3.1.0
  • Spring AMQP 3.1.0
  • Spring LDAP 3.2.0
  • Micrometer 1.12.0

虚拟线程支持

支持 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 中的内存管理改进

使用 JpaItemWriter 时,如果块大小足够大,JPA 持久化上下文可能会迅速增长。如果未能及时恰当地清除,这可能会导致 OutOfMemoryError 错误。

在此里程碑版本中,JpaItemWriter 中引入了一个名为 clearPersistenceContext 的新选项,用于在写入每个项目块后清除持久化上下文。此选项改进了处理大量数据并配置了较大块大小的面向块步骤的内存管理。

用于 Item Reader 和 Writer 的新同步装饰器

直到 5.0 版本,Spring Batch 提供了两个装饰器 SynchronizedItemStreamReaderSynchronizedItemStreamWriter 来同步线程对 ItemStreamReader#readItemStreamWriter#write 的访问。这些装饰器在多线程步骤中使用非线程安全的 Item Streams 时非常有用。

虽然这些装饰器适用于 ItemStream 实现,但它们不能用于非 Item Streams。例如,这些装饰器不能用于同步对 ListItemReader#readKafkaItemWriter#write 的访问。

为了方便用户,此版本还为非 Item Streams 引入了新的装饰器。借助此新功能,Spring Batch 中的所有 Item Reader 和 Writer 现在都可以同步,而无需编写自定义装饰器。

新的基于游标的 MongoItemReader

直到 5.0 版本,Spring Batch 提供的 MongoItemReader 使用分页,这是基于 MongoDB 的 skip 操作。虽然这对小型/中型数据集效果很好,但对于大型数据集,其性能开始变差。

此版本引入了 MongoCursorItemReader,这是一个新的基于游标的 MongoDB Item Reader。此实现使用游标而不是分页来从 MongoDB 读取数据,这改进了对大型集合的读取性能。

为了与其他基于游标/分页的 Reader 保持一致,当前的 MongoItemReader 已重命名为 MongoPagingItemReader

MongoItemWriter 中的批量插入支持

直到 5.0 版本,MongoItemWriter 支持两种操作:upsertdelete。虽然 upsert 操作对于插入和更新都效果很好,但对于目标集合中已知为新的项目,其性能不佳。

JpaItemWriter 中的 persistmerge 操作类似,此版本在 MongoItemWriter 中添加了一个名为 insert 的新操作,该操作专为批量插入设计。对于新项目,此新选项的性能优于 upsert,因为它不需要额外的查找来检查目标集合中是否存在项目。

用于 Redis 的新 Item Reader 和 Writer

在 Spring Batch 的上下文中,使用 Redis 的一个典型场景是在作业执行之前/之后使用参考数据填充/清除缓存。这是一种常见的性能改进模式,用于从缓存查询数据,而不是在作业执行期间向主数据库发出多次查询。

在此版本中,基于 Spring Data Redis 的新 RedisItemReaderRedisItemWriter 已引入内置 Item Reader 和 Writer 库中。可以通过 ScanOptions 配置 Reader 以扫描要从 Redis 读取的键集。可以通过 RedisTemplate 配置 Writer 以将项目写入 Redis。

JobRegistryBeanPostProcessor 的自动配置

在 Spring Batch 应用程序中配置 JobOperator 时,需要在操作员的 JobRegistry 中注册作业。此注册过程可以手动完成,也可以通过将 JobRegistryBeanPostProcessor bean 添加到应用程序上下文中来自动完成。

在此版本中,Spring Batch 的默认配置(即使用 @EnableBatchProcessing 或扩展 DefaultBatchConfiguration 时)现在会自动在应用程序上下文中注册一个 JobRegistryBeanPostProcessor bean。这简化了配置过程,并改善了使用 JobOperator 时的用户体验。

能够以决策开始作业流程

使用 XML 配置样式时,可以通过 decision 元素以决策开始作业流程。但是,直到 5.0 版本,使用 Java API 无法实现相同的流程定义。

此版本为 JobBuilder API 添加了一个新选项,以便使用 JobExecutionDecider 开始作业流程。这使得两种配置样式更加一致。

能够提供自定义的 JobKeyGenerator

默认情况下,Spring Batch 通过计算标识性作业参数的哈希值来识别作业实例。虽然不太可能需要自定义此识别过程,但 Spring Batch 仍然为用户提供了策略接口,通过 JobKeyGenerator API 覆盖默认机制。

直到 5.0 版本,如果不创建自定义的 JobRepositoryJobExplorer,则无法提供自定义键生成器。在此版本中,现在可以通过 JobRepositoryJobExplorer 的工厂 bean 提供自定义的 JobKeyGenerator

MongoDB Job Repository (实验性)

此特性引入了由 MongoDB 支持的新的 JobRepositoryJobExplorer 实现。这个期待已久的特性现已作为实验性功能提供,标志着 Spring Batch 第一个 NoSQL 元数据存储的引入。

复合 Item Reader (实验性)

此特性引入了一个复合 ItemReader 实现。与 CompositeItemProcessorCompositeItemWriter 类似,其思想是将读取依次委托给 Item Reader 列表。当需要从不同来源(文件、数据库等)读取具有相同格式的数据时,这非常有用。

基于 Antora 的新文档

参考文档已更新为使用 Antora。此更新引入了许多改进,包括但不限于

  • 多版本文档:借助左侧菜单中的下拉版本列表,现在可以在不同版本之间导航。
  • 集成搜索体验:由 Algolia 提供支持,页面左上角的集成搜索框带来了更好的搜索体验
  • 改进的配置样式切换:用于在 XML 和 Java 配置样式之间切换代码片段的切换器现在位于每个示例附近,而不是每个页面顶部

您可以在此处查看新文档版本。

更新的入门指南

入门指南已经存在很长时间了,很好地展示了如何将 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 IssuesGithub DiscussionsTwitterStackOverflow 上提供反馈。

Spring Batch 主页|Github 源码|参考文档

获取 Spring 邮件列表

订阅 Spring 邮件列表保持连接

订阅

领先一步

VMware 提供培训和认证,助您快速发展。

了解更多

获取支持

Tanzu Spring 通过一份简单的订阅提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部