What’s New in Spring Batch 5.1

Dependencies upgrade

在此版本中,Spring 依赖项已升级到以下版本:

  • Spring Framework 6.1.0

  • Spring Integration 6.2.0

  • Spring Data 3.2.0

  • Spring LDAP 3.2.0

  • Spring AMQP 3.1.0

  • Spring Kafka 3.1.0

  • Micrometer 1.12.0

Virtual Threads support

采用 JDK 21 LTS 是 Spring Batch 5.1 的主要主题之一,尤其是对 Project Loom 中的虚拟线程的支持。在此版本中,虚拟线程可用于框架的所有区域,例如使用虚拟线程运行并发步骤或使用虚拟线程并行启动多个步骤。

得益于 Spring Batch 中设计精良的关注点分离功能,线程不受直接管理。相反,线程管理委派给 Spring Framework 中的 TaskExecutor 实现。这种编程到接口的方法允许您以透明且灵活的方式在 TaskExecutor 实现之间切换。

在 Spring Framework 6.1 中,引入了一个基于虚拟线程的新 TaskExecutor 实现,即 VirtualThreadTaskExecutor。可以在 TaskExecutor 所需的任何地方使用此 TaskExecutor

Memory management improvement in the JpaItemWriter

在使用 JpaItemWriter 时,如果块大小足够大,JPA 持久性上下文可能会快速增长。如果不及时适当地将其清除,则可能导致 OutOfMemoryError 错误。

在此版本中,在 JpaItemWriter 中引入了名为 clearPersistenceContext 的新选项,以在写入每块项目后清除持久性上下文。此选项改进了处理大量数据和大块大小的分块导向步骤的内存管理。

New synchronized decorators for item readers and writers

在 5.0 版本之前,Spring Batch 提供了两个装饰器 SynchronizedItemStreamReaderSynchronizedItemStreamWriter,以同步线程对 ItemStreamReader#readItemStreamWriter#write 的访问。在多线程步骤中使用非线程安全的项目流时,这些装饰器很有用。

虽然这些装饰器与 ItemStream 实现一起使用,但它们不能与非项目流一起使用。例如,这些装饰器不能用于同步对 ListItemReader#readKafkaItemWriter#write 的访问。

为了使用户更加便利,此版本还为非项目流引入了新的装饰器。借助此新特性,Spring Batch 中的所有项目读取器和写入器现在可以在无需编写自定义装饰器的情况下进行同步。

New Cursor-based MongoItemReader

在 5.0 版本之前,Spring Batch 提供的 MongoItemReader 使用了基于 MongoDB 的 skip 操作的分页。虽然这种方法适用于中小型数据集,但对于大型数据集而言,它的性能开始变差。

此版本引入了 MongoCursorItemReader,这是 MongoDB 的一个基于游标的新项目读取器。此实现使用游标代替分页来读取 MongoDB 中的数据,这改善了对大型集合的读取性能。为了与其他游标/分页读取器保持一致,现已将 MongoItemReader 重命名为 MongoPagingItemReader

Bulk inserts support in MongoItemWriter

在 5.0 版本之前,MongoItemWriter 支持两个操作:upsertdelete。虽然 upsert 操作可以正常用于插入和更新,但对于已知在目标集合中为新项目的项目,它的性能不佳。

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

New item reader and writer for Redis

RedisItemReader 现已在内置项目读取器库中提供。此读取器基于 Spring Data Redis,可以使用 ScanOptions 进行配置,以扫描要从中读取 Redis 的键集。

类似地,基于 Spring Data Redis 的新 RedisItemWriter 现在是写入器库的一部分。可以使用 RedisTemplate 配置此写入器,以将项目写入 Redis。

Automatic configuration of JobRegistryBeanPostProcessor

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

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

Ability to start a job flow with a decision

在使用 XML 配置样式时,借助 <decision> 元素启动带有决策器的作业流程是可行的。但是,在 5.0 版本之前,无法使用 Java API 实现相同的流程定义。

在此版本中,已向 JobBuilder API 添加了启动带有 JobExecutionDecider 的作业流程的新选项。这样使两种配置样式更一致。

Ability to provide a custom JobKeyGenerator

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

在 5.0 版本之前,如果没有创建自定义 JobRepositoryJobExplorer,则无法提供自定义键生成器。在此版本中,现在可以通过 JobRepositoryJobExplorer 的工厂 Bean 提供自定义 JobKeyGenerator

New documentation based on Antora

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

  • 多版本文档:现在可以通过左侧菜单中的下拉版本列表从一个版本导航到另一个版本。

  • 集成搜索体验:由 Algolia 提供支持,得益于页面左上方的集成搜索框,搜索体验现已提升

  • 改进的配置样式切换:用于在代码片段的 XML 和 Java 配置样式之间切换的切换现在位于每个样例附近,而不是每个页面的顶部

Improved Getting Started experience

在此版本中,入门体验在许多方面得到了改善:

  • 样例现在按功能打包,并以两种配置样式提供:XML 和 Java 配置

  • 自述文件中添加了新的 Two minutes tutorial

  • Getting Started Guide 已更新至最新和最出色的 Spring Batch 和 Spring Boot 版本

  • Issue Reporting Guide 已更新,其中包括详细的指导和项目模板,以帮助您轻松地报告问题

MongoDB Job Repository (Experimental)

此功能引入了由 MongoDB 支持的 JobRepositoryJobExplorer 的新实现。此项长期期待的功能现在已可用作为实验功能,并标志着 Spring Batch 中引入了第一个 NoSQL 元数据存储。

有关此功能的更多详细信息,请参阅 Spring Batch Experimental 储存库。

Composite Item Reader (Experimental)

此功能引入了一个复合 ItemReader 实现。与 CompositeItemProcessorCompositeItemWriter 相似,其思想是有序地将读取委派给项目读取器列表。当需要从不同的源(文件、数据库等)读取相同格式的数据时,这会十分有用。

有关此功能的更多详细信息,请参阅 Spring Batch Experimental 储存库。

New Chunk-Oriented Step implementation (Experimental)

这不是一项新功能,而是按块进行处理模型的新实现。其目标是解决当前实现中报告的问题,并为即将重新设计的并发模型提供一个新的基础。

有关此新实现的更多详细信息,请参阅 Spring Batch Experimental 储存库。