领先一步
VMware 提供培训和认证,助您加速进步。
了解更多很高兴地宣布,Spring Batch 5.2 的第二个里程碑版本现已通过我们的里程碑仓库提供。这篇博文将引导您了解 Spring Batch 5.2 的主要变更。
有关完整的变更列表,请查看 发布说明。
此版本引入了第一个基于 MongoDB 的 NoSQL 作业仓库实现。与关系型作业仓库实现类似,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)一起使用。该实现不是线程安全的,不应在任何并发环境中使用。
与 CompositeItemProcessor 和 CompositeItemWriter 类似,我们引入了一个新的 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.Function 适配为项处理器(item processor)的 FucntionItemProcessor 类似,此版本为其他 java.util.function 接口(如 Supplier、Consumer 和 Predicate)引入了几个新的适配器。
新添加的适配器包括:SupplierItemReader、ConsumerItemWriter 和 PredicateFilteringItemProcessor。有关这些新适配器的更多详细信息,请参阅 org.springframework.batch.item.function 包。
分阶段事件驱动架构 (SEDA) 是一种强大的架构风格,用于处理由队列连接的各个阶段的数据。这种风格直接适用于数据管道,并且由于 Spring Batch 能够将作业设计为一系列步骤,因此可以轻松实现。
这里唯一缺失的部分是如何读写中间队列的数据。此版本引入了一个项读取器和项写入器,用于从 BlockingQueue 读取数据并写入其中。借助这两个新类,可以设计第一个准备队列中数据的步骤,以及第二个从同一队列消耗数据的步骤。这样,这两个步骤就可以并发运行,以非阻塞、事件驱动的方式高效地处理数据。
我想感谢所有为此版本做出贡献的贡献者!这个里程碑标志着 5.2.0 的功能冻结版本。我们将在即将到来的 5.2.0-RC1 和 5.2.0 GA 版本(将于 11 月发布)中开始使此版本稳定。
我们期待您在 Github Issues、Github Discussions、Twitter 和 StackOverflow 上提供反馈。
请注意,5.1.x 版本将于 2024 年 11 月 22 日停止 OSS 支持。因此,我鼓励用户在 Spring Batch 5.2.0 发布后尽快规划将其应用程序升级到该版本。