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 中使用批量写入

到目前为止,MongoItemWriter 使用 for 循环中的 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上对这个里程碑的反馈。

脚注

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

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

获取Spring新闻通讯

关注Spring新闻通讯

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部