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
可在需要 TaskExecutor
的任何地方用于 Spring Batch。
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
现在是写入器库的一部分。此写入器可以配置 RedisTemplate
以将项目写入 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 通过计算标识作业参数的 MD5 哈希来标识作业实例。虽然不太可能需要自定义此标识过程,但 Spring Batch 仍为用户提供了一个策略接口,以便通过 JobKeyGenerator
API 覆盖默认机制。
在 5.0 版本之前,不可能提供自定义键生成器,而无需创建自定义 JobRepository
和 JobExplorer
。在此版本中,现在可以通过 JobRepository
和 JobExplorer
的工厂 bean 提供自定义 JobKeyGenerator
。
基于 Antora 的新文档
已更新参考文档以使用 Antora。此更新引入了一些改进,包括但不限于
-
多版本文档:现在可以通过左侧菜单中的下拉版本列表从一个版本导航到另一个版本。
-
集成搜索体验:由 Algolia 提供支持,现在通过页面左上角的集成搜索框,搜索体验得到了改善
-
改进的配置样式切换:用于在代码片段的 XML 和 Java 配置样式之间切换的切换现在位于每个示例附近,而不是每页顶部
MongoDB 作业存储库(实验性)
此功能引入了新的 JobRepository
和 JobExplorer
实现,由 MongoDB 支持。此项期待已久的功能现已作为实验性功能提供,并标志着 Spring Batch 引入了第一个 NoSQL 元数据存储。
有关此功能的更多详细信息,请参阅 Spring Batch Experimental 存储库。
复合项目读取器(实验性)
此功能引入了复合 ItemReader
实现。与 CompositeItemProcessor
和 CompositeItemWriter
类似,其理念是按顺序将读取委托给项目读取器列表。当需要从不同来源(文件、数据库等)读取具有相同格式的数据时,此功能非常有用。
有关此功能的更多详细信息,请参阅 Spring Batch Experimental 存储库。
新的面向块的步骤实现(实验性)
这不是一项新功能,而是一个面向块的处理模型的新实现。其目标是解决当前实现中报告的问题,并为即将重新设计的并发模型提供新的基础。
有关此新实现的更多详细信息,请参阅 Spring Batch Experimental 存储库。