Spring Batch 5.2.0-M2 现已可用!

版本发布 | Mahmoud Ben Hassine | 2024年10月11日 | ...

我很高兴地宣布 Spring Batch 5.2 的第二个里程碑版本现已在我们里程碑仓库中可用。这篇博客文章将向您介绍 Spring Batch 5.2 的主要变更。

  • 支持 MongoDB 作业仓库
  • 新的无资源作业仓库
  • 复合项读取器实现
  • 用于 java.util.function API 的新适配器
  • 使用阻塞队列项读取器和写入器的并发步骤

有关完整的更改列表,请查看发布说明

支持 MongoDB 作业仓库

此版本引入了第一个 NoSQL 作业仓库实现,它由 MongoDB 支持。类似于关系型作业仓库实现,Spring Batch 提供了脚本用于在 MongoDB 中创建必要的集合,以便保存和检索批处理元数据。

此实现要求 MongoDB 版本为 4 或更高,并基于 Spring Data MongoDB。为了使用此作业仓库,您只需定义一个 MongoTemplate 和一个 MongoTransactionManager,这是新增的 MongoDBJobRepositoryFactoryBean 所必需的。

@Bean
public JobRepository jobRepository(MongoTemplate mongoTemplate, MongoTransactionManager transactionManager) throws Exception {
	MongoJobRepositoryFactoryBean jobRepositoryFactoryBean = new MongoJobRepositoryFactoryBean();
	jobRepositoryFactoryBean.setMongoOperations(mongoTemplate);
	jobRepositoryFactoryBean.setTransactionManager(transactionManager);
	jobRepositoryFactoryBean.afterPropertiesSet();
	return jobRepositoryFactoryBean.getObject();
}

定义好 MongoDB 作业仓库后,您可以像常规作业仓库一样将其注入到任何作业或步骤中。您可以在 MongoDBJobRepositoryIntegrationTests 中找到一个完整的示例。

新的无资源作业仓库

在 v5 中,基于内存 Map 的作业仓库实现由于多种原因被移除。Spring Batch 中剩下的唯一作业仓库实现是 JDBC 实现,它需要一个数据源。虽然这在 H2 或 HSQLDB 等内存数据库中运行良好,但对于我们社区中许多曾经使用基于 Map 的仓库而没有任何额外依赖的用户来说,要求数据源是一个强约束。

在此版本中,我们引入了一种 JobRepository 实现,它不使用或存储任何形式的批处理元数据(甚至不存储在内存中)。它是一个“无操作”(NoOp)实现,会丢弃批处理元数据,并且不与任何资源交互(因此得名“无资源作业仓库”,该名称源自“无资源事务管理器”)。

此实现旨在用于不需要重启功能且执行上下文不以任何方式涉及的用例(例如通过执行上下文在步骤之间共享数据,或通过执行上下文在管理器和工作节点之间共享分区元数据的分区步骤等)。

此实现适用于在其自己的 JVM 中执行的一次性作业。它适用于事务性步骤(例如,使用 DataSourceTransactionManager 配置)以及非事务性步骤(使用 ResourcelessTransactionManager 配置)。该实现不是线程安全的,不应在任何并发环境中使用。

复合项读取器实现

类似于 CompositeItemProcessorCompositeItemWriter,我们引入了一个新的 CompositeItemReader 实现,该实现设计用于从多个具有相同格式的源中顺序读取数据。当数据分散在不同的资源中且自定义读取器不是一个选项时,这非常有用。

CompositeItemReader 的工作方式与其他复合神器一样,它按顺序将读取操作委托给常规项读取器。这里有一个简单的示例,展示了一个复合读取器,它先从平面文件中读取人员数据,然后再从数据库表中读取

@Bean
public FlatFileItemReader<Person> itemReader1() {
    return new FlatFileItemReaderBuilder<Person>()
            .name("personFileItemReader")
            .resource(new FileSystemResource("persons.csv"))
            .delimited()
            .names("id", "name")
            .targetType(Person.class)
            .build();
}

@Bean
public JdbcCursorItemReader<Person> itemReader2() {
    String sql = "select * from persons";
    return new JdbcCursorItemReaderBuilder<Person>()
            .name("personTableItemReader")
            .dataSource(dataSource())
            .sql(sql)
            .beanRowMapper(Person.class)
            .build();
}

@Bean
public CompositeItemReader<Person> itemReader() {
    return new CompositeItemReader<>(Arrays.asList(itemReader1(), itemReader2()));
}

java.util.function API 的新适配器

类似于将 java.util.function.Function 适配到项处理器的 FucntionItemProcessor,此版本为其他 java.util.function 接口(如 SupplierConsumerPredicate)引入了几个新适配器。

新增的适配器有:SupplierItemReaderConsumerItemWriterPredicateFilteringItemProcessor。有关这些新适配器的更多详细信息,请参阅 org.springframework.batch.item.function 包。

使用阻塞队列项读取器和写入器的并发步骤

分阶段事件驱动架构 (SEDA) 是一种强大的架构风格,用于在由队列连接的阶段中处理数据。这种风格直接适用于数据管道,并且得益于将作业设计为一系列步骤的能力,可以轻松地在 Spring Batch 中实现。

这里唯一缺少的部分是如何读写数据到中间队列。此版本引入了一个项读取器和一个项写入器,用于从 BlockingQueue 中读取数据并写入数据。有了这两个新类,可以设计一个第一步在队列中准备数据,然后一个第二步从同一个队列中消费数据。这样,两个步骤可以并发运行,以非阻塞、事件驱动的方式高效处理数据。

接下来是什么?

我要感谢所有为本次发布做出贡献的人!这个里程碑版本标志着 5.2.0 的功能冻结。我们将在接下来的 5.2.0-RC1 和 11 月的 5.2.0 GA 版本中致力于使此版本稳定。

我们期待您在Github IssuesGithub DiscussionsTwitterStackOverflow 上提供反馈。

请注意,5.1.x 将于 2024 年 11 月 22 日停止 OSS 支持。因此,我鼓励我们的用户计划在 Spring Batch 5.2.0 发布后尽快将其应用程序升级到该版本。

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

获取 Spring 新闻邮件

订阅 Spring 新闻邮件,保持联系

订阅

抢占先机

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

了解更多

获取支持

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

了解更多

即将到来的活动

查看 Spring 社区所有即将到来的活动。

查看全部