Spring Batch 4.3.0-M1 已发布!

发布 | Mahmoud Ben Hassine | 2020 年 6 月 26 日 | ...

我谨代表 Spring Batch 团队宣布,Spring Batch 4.3.0-M1 现在已可从我们的里程碑仓库获取。

有哪些新内容?

此版本包含了许多新特性、性能改进和错误修复,以及文档和依赖项更新!您可以在发布说明中找到完整的更改列表,但以下是主要的亮点

新特性

1. 新的同步 ItemStreamWriter

类似于 SynchronizedItemStreamReader,我们添加了 SynchronizedItemStreamWriter。此功能对于多线程步骤非常有用,其中并发线程需要同步以避免相互覆盖写入。

2. 在 JpaPagingItemReader 中添加对命名查询的支持

到目前为止,可以在 JpaPagingItemReader 中使用命名查询。但是,这需要创建一个自定义查询提供程序,如下所示

JpaPagingItemReader<Foo> reader = new JpaPagingItemReaderBuilder<Foo>()
    .name("fooReader")
    .queryProvider(new AbstractJpaQueryProvider() {
       @Override
       public Query createQuery() {
          return getEntityManager().createNamedQuery("allFoos", Foo.class);
       }

       @Override
       public void afterPropertiesSet() throws Exception {
       }
    })
    // set other properties on the reader
    .build();

在此版本中,我们在 JpaNativeQueryProvider 旁边引入了 JpaNamedQueryProvider 以简化配置,现在可以这样编写

JpaPagingItemReader<Foo> reader = new JpaPagingItemReaderBuilder<Foo>()
		.name("fooReader")
		.queryProvider(new JpaNamedQueryProvider("allFoos", Foo.class))
		// set other properties on the reader
		.build();

3. 使用 JUnit 5 简化 Spring Batch 测试配置

类似于许多 Spring Boot 测试注解元注解了 @ExtendWith(SpringExtension.class)(例如 @SpringBootTest@WebMvcTest 等),我们更新了 `@SpringBatchTest` 以元注解 @ExtendWith(SpringExtension.class)。这简化了使用 JUnit Jupiter 编写测试时的配置。

请注意,此功能不影响 JUnit 4 用户,仅涉及基于 JUnit 5 的测试。

性能改进

沿着我们在4.2 版本中引入的性能改进思路,我们在此版本中也继续改进了框架的几个部分。

1. 在 RepositoryItemWriter 中使用批量写入

在 4.2 版本之前,需要指定用于将项保存到数据库的方法名称。然后,此方法将在 for 循环中被调用以保存所有项。为了使用 CrudRepository#saveAll,需要扩展 RepositoryItemWriter 并覆盖 write(List),这很不方便。

在此版本中,我们默认让 RepositoryItemWriter 使用 CrudRepository#saveAll。根据我们的基准测试repository-item-writer-benchmark,此更改将写入器的性能提高了 **2 倍**

perf-repository-item-write

2. 在 MongoItemWriter 中使用批量写入

到目前为止,MongoItemWriterfor 循环中使用 MongoOperations#save() 将项保存到数据库。在此版本中,我们将此机制替换为单个 BulkOperations 调用。根据我们的基准测试mongo-item-writer-benchmark,此更改使 MongotItemWriter 比以前的版本快 25 倍

perf-mongo-item-writer

3. 作业启动/重启时间改进

当启动一个新作业(或重启一个失败的作业)时,Spring Batch 会进行一系列检查以验证一些条件

  • 检查当前执行是新执行还是失败执行的重启
  • 检查执行次数是否超过启动限制
  • 附加检查...

所有这些检查都涉及到调用 JobRepository.getStepExecutionCount 来计算步骤执行次数。在 v4.2 之前,此方法的实现会加载所有作业执行和步骤执行,在框架端内存中进行计数。在此版本中,我们已将实现更改为对数据库进行单次 count 查询调用。此更改提高了内存使用效率以及方法的响应时间(根据我们的基准测试step-execution-count-benchmark,性能提高了 **6 倍**),从而提高了步骤和作业的整体启动时间

perf-step-execution-count

依赖项升级

此版本将 Spring 项目依赖项升级到以下版本

  • Spring Framework 5.3.0-M1
  • Spring Data 2020.0.0-M1
  • Spring Integration 5.4.0-M1
  • Spring AMQP 2.3.0-M1

Spring Batch v4.3.0-M1 可以与计划于下周发布的 Spring Boot 2.4.0-M1 一起使用。敬请关注!

反馈与贡献

我要感谢所有贡献者,特别是 Parikshit Dutta 在此版本中的许多贡献!我们期待您在 TwitterStackOverflowGithub 上提供关于此里程碑的反馈。

脚注

所有基准测试均在 Macbook Pro 上进行,配置为 16GB 内存、2.9 GHz Intel Core i7 CPU、MacOS Catalina 10.15.5 和 Oracle JDK 1.8.0_201。您可以在以下链接中找到所有基准测试的源代码

Spring Batch 主页 | GitHub 上的源代码 | 参考文档

获取 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助力您的进步。

了解更多

获取支持

Tanzu Spring 通过简单订阅即可为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

近期活动

查看 Spring 社区的所有近期活动。

查看全部