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 的内存管理改进
  • 用于项目读取器和写入器的新同步装饰器
  • 新的基于游标的 MongoItemReader
  • MongoItemWriter 中的批量插入支持
  • 用于 Redis 的新的项目读取器和写入器
  • JobRegistryBeanPostProcessor 的自动配置
  • 能够使用决策启动作业流
  • 能够提供自定义的 JobKeyGenerator
  • MongoDB 作业存储库(实验性)
  • 复合项目读取器(实验性)
  • 基于 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 的新选项,用于在写入每一块项目后清除持久性上下文。此选项改进了处理大量数据并配置了较大块大小的分块导向步骤的内存管理。

用于项目读取器和写入器的新同步装饰器

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

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

为方便用户,此版本还引入了用于非项目流的新装饰器。通过此新功能,现在可以同步 Spring Batch 中的所有项目读取器和写入器,而无需编写自定义装饰器。

新的基于游标的 MongoItemReader

在 5.0 版本之前,Spring Batch 提供的 MongoItemReader 使用分页,它基于 MongoDB 的 skip 操作。虽然这对于小型/中型数据集有效,但对于大型数据集,它的性能开始下降。

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

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

MongoItemWriter 中的批量插入支持

在 5.0 版本之前,MongoItemWriter 支持两种操作:upsertdelete。虽然 upsert 操作对于插入和更新都适用,但对于已知在目标集合中为新的项目,它的性能并不理想。

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

用于 Redis 的新的项目读取器和写入器

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

此版本在内置项目读取器和写入器库中引入了基于Spring Data Redis 的新的RedisItemReaderRedisItemWriter。读取器可以使用ScanOptions配置扫描要从Redis读取的键集。写入器可以使用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 通过计算标识作业参数的哈希值来标识作业实例。虽然不太需要自定义此标识过程,但 Spring Batch 仍然提供了一个策略接口,供用户通过JobKeyGenerator API 覆盖默认机制。

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

MongoDB 作业存储库(实验性)

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

复合项目读取器(实验性)

此功能引入了复合ItemReader实现。类似于CompositeItemProcessorCompositeItemWriter,其思想是按顺序将读取委托给项目读取器列表。当需要从不同的来源(文件、数据库等)读取具有相同格式的数据时,这非常有用。

基于 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 中的特定功能。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 IssuesGithub DiscussionsTwitterStackOverflow上提供反馈。

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

获取Spring新闻通讯

关注Spring新闻通讯

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring在一个简单的订阅中提供对OpenJDK™、Spring和Apache Tomcat®的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部