领先一步
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
的内存管理改进使用 JpaItemWriter
时,如果块大小足够大,JPA 持久性上下文可能会快速增长。如果未及时清除,这可能会导致 OutOfMemoryError
错误。
在此里程碑版本中,在 JpaItemWriter
中引入了一个名为 clearPersistenceContext
的新选项,用于在写入每一块项目后清除持久性上下文。此选项改进了处理大量数据并配置了较大块大小的分块导向步骤的内存管理。
在 5.0 版本之前,Spring Batch 提供了两个装饰器 SynchronizedItemStreamReader
和 SynchronizedItemStreamWriter
来同步对 ItemStreamReader#read
和 ItemStreamWriter#write
的线程访问。当在多线程步骤中使用非线程安全的项目流时,这些装饰器很有用。
虽然这些装饰器可用于 ItemStream
实现,但它们不能用于非项目流。例如,这些装饰器不能用于同步对 ListItemReader#read
或 KafkaItemWriter#write
的访问。
为方便用户,此版本还引入了用于非项目流的新装饰器。通过此新功能,现在可以同步 Spring Batch 中的所有项目读取器和写入器,而无需编写自定义装饰器。
在 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
,因为它不需要额外的查找来检查项目是否已存在于目标集合中。
在 Spring Batch 上下文中使用 Redis 的一个典型案例是在作业执行之前/之后使用参考数据填充/清除缓存。这是一个常见的性能改进模式,它有助于在作业执行期间从缓存中查询数据,而不是向主数据库发出多个查询。
此版本在内置项目读取器和写入器库中引入了基于Spring Data Redis 的新的RedisItemReader
和RedisItemWriter
。读取器可以使用ScanOptions
配置扫描要从Redis读取的键集。写入器可以使用RedisTemplate
配置将项目写入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
,其思想是按顺序将读取委托给项目读取器列表。当需要从不同的来源(文件、数据库等)读取具有相同格式的数据时,这非常有用。
参考文档已更新为使用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 中的特定功能。Spring Batch 示例的主要README
文件包含一个表格,其中显示了可用的示例及其涵盖的功能。
此外,每个示例现在都有自己的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上提供反馈。