Spring Batch 5.1 新特性
依赖项升级
在此版本中,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
虚拟线程支持
拥抱 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
的地方。
JpaItemWriter 的内存管理改进
使用 JpaItemWriter
时,当块大小足够大时,JPA 持久性上下文可能会快速增长。如果未及时适当地清除,这可能会导致 OutOfMemoryError
错误。
在此版本中,在 JpaItemWriter
中引入了一个名为 clearPersistenceContext
的新选项,用于在写入每个项目块后清除持久性上下文。此选项改进了处理大量数据和大型块大小的面向块的步骤的内存管理。
用于项目读取器和写入器的新同步装饰器
在 5.0 版之前,Spring Batch 提供了两个装饰器 SynchronizedItemStreamReader
和 SynchronizedItemStreamWriter
来同步线程对 ItemStreamReader#read
和 ItemStreamWriter#write
的访问。当在多线程步骤中使用非线程安全的项目流时,这些装饰器很有用。
虽然这些装饰器适用于 ItemStream
实现,但它们不能用于非项目流。例如,这些装饰器无法用于同步对 ListItemReader#read
或 KafkaItemWriter#write
的访问。
为了方便用户,此版本也为非项目流引入了新的装饰器。使用此新功能,Spring Batch 中的所有项目读取器和写入器现在都可以同步,而无需编写自定义装饰器。
新的基于游标的 MongoItemReader
在 5.0 版之前,Spring Batch 提供的 MongoItemReader
使用分页,它基于 MongoDB 的 skip
操作。虽然这对小型/中型数据集效果很好,但它在处理大型数据集时性能开始下降。
此版本引入了 MongoCursorItemReader
,这是一个用于 MongoDB 的新的基于游标的项目读取器。此实现使用游标而不是分页从 MongoDB 读取数据,从而提高了大型集合读取的性能。为了与其他游标/分页读取器保持一致,当前的 MongoItemReader
已重命名为 MongoPagingItemReader
。
MongoItemWriter 中的批量插入支持
在 5.0 版之前,MongoItemWriter
支持两种操作:upsert
和 delete
。虽然 upsert
操作适用于插入和更新,但它对目标集合中已知为新的项目性能不佳。
类似于 JpaItemWriter
中的 persist
和 merge
操作,此版本在 MongoItemWriter
中添加了一个名为 insert
的新操作,该操作专为批量插入而设计。对于新项目,此新选项的性能优于 upsert
,因为它不需要额外的查找来检查项目是否已存在于目标集合中。
用于 Redis 的新的项目读取器和写入器
库中现在提供了新的 RedisItemReader
,它是内置项目读取器的一部分。此读取器基于 Spring Data Redis,并可以使用 ScanOptions
配置以扫描要从 Redis 读取的键集。
类似地,一个基于 Spring Data Redis 的新的 RedisItemWriter
现在是 writers 库的一部分。这个 writer 可以配置一个 RedisTemplate
来将项目写入 Redis。
JobRegistryBeanPostProcessor 的自动配置
在 Spring Batch 应用程序中配置 JobOperator
时,需要在 operator 的 JobRegistry
中注册作业。这个注册过程可以通过手动或自动添加 JobRegistryBeanPostProcessor
bean 到应用程序上下文来完成。
在这个版本中,Spring Batch 的默认配置(即通过使用 @EnableBatchProcessing
或扩展 DefaultBatchConfiguration
)现在会自动将 JobRegistryBeanPostProcessor
bean 注册到应用程序上下文。这简化了配置过程,并在使用 JobOperator
时改善了用户体验。
使用决策启动作业流程的能力
使用 XML 配置风格时,可以借助 <decision>
元素使用决策器启动作业流程。但是,在 5.0 版本之前,无法使用 Java API 实现相同的流程定义。
在这个版本中,在 JobBuilder
API 中添加了一个使用 JobExecutionDecider
启动作业流程的新选项。这使得两种配置风格更加一致。
提供自定义 JobKeyGenerator 的能力
默认情况下,Spring Batch 通过计算识别作业参数的 MD5 哈希值来识别作业实例。虽然不太可能需要自定义此识别过程,但 Spring Batch 仍然提供了一个策略接口,供用户通过 JobKeyGenerator
API 覆盖默认机制。
在 5.0 版本之前,如果不创建自定义的 JobRepository
和 JobExplorer
,则无法提供自定义的密钥生成器。在这个版本中,现在可以通过 JobRepository
和 JobExplorer
的工厂 bean 提供自定义的 JobKeyGenerator
。
基于 Antora 的新文档
参考文档已更新为使用 Antora。此更新引入了许多改进,包括但不限于
-
多版本文档:现在可以借助左侧菜单中的下拉版本列表在不同版本之间导航。
-
集成的搜索体验:由 Algolia 提供支持,由于页面左上方的集成搜索框,搜索体验现在得到了改善
-
改进的配置样式切换:用于在代码片段的 XML 和 Java 配置样式之间切换的切换按钮现在位于每个示例附近,而不是每个页面的顶部
MongoDB 作业存储库(实验性)
此功能引入了由 MongoDB 支持的 JobRepository
和 JobExplorer
的新实现。这个期待已久的特性现在作为实验性提供,标志着 Spring Batch 第一个 NoSQL 元数据存储的引入。
有关此功能的更多详细信息,请参阅 Spring Batch 实验 存储库。
复合项目读取器(实验性)
此功能引入了复合 ItemReader
实现。类似于 CompositeItemProcessor
和 CompositeItemWriter
,其思想是按顺序将读取委托给项目读取器列表。当需要从不同来源(文件、数据库等)读取具有相同格式的数据时,这很有用。
有关此功能的更多详细信息,请参阅 Spring Batch 实验 存储库。
新的分块式步骤实现(实验性)
这不是一个新功能,而是一个分块式处理模型的新实现。目标是解决当前实现中报告的问题,并为即将推出的重新设计的并发模型提供新的基础。
有关此新实现的更多详细信息,请参阅 Spring Batch 实验 存储库。