此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Batch 文档 5.2.2! |
Spring Batch 6 中的新增功能
本节重点介绍 Spring Batch 6.0 中的主要变化。有关更改的完整列表,请参阅发行说明。
Spring Batch 6.0 包括以下功能:
依赖项升级
在此主要版本中,Spring 依赖项已升级到以下版本:
-
Spring 框架 7.0
-
Spring 集成 7.0
-
Spring Data 4.0
-
弹簧 LDAP 4.0
-
Spring AMQP 4.0
-
春季卡夫卡 4.0
-
千分尺 1.16
批处理基础结构配置改进
批处理基础结构配置的新注释和类
在 v6 之前,@EnableBatchProcessing
注释与基于 JDBC 的基础设施相关联。现在情况已不再如此。引入了两个新的注释来配置基础作业存储库:@EnableJdbcJobRepository
和@EnableMongoJobRepository
.
从 v6 开始,@EnableBatchProcessing
允许您为批处理基础架构配置通用属性,而可以使用新的专用注释指定特定于存储的属性。
以下是如何使用这些注释的示例:
@EnableBatchProcessing(taskExecutorRef = "batchTaskExecutor")
@EnableJdbcJobRepository(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")
class MyJobConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("job", jobRepository)
// job flow omitted
.build();
}
}
同样,基于DefaultBatchConfiguration
已更新,引入了两个新的配置类来定义特定于商店的属性:JdbcDefaultBatchConfiguration
和MongoDefaultBatchConfiguration
.
这些类可用于以编程方式配置每个作业存储库以及其他批处理基础架构 Bean 的特定属性。
默认情况下的无资源批处理基础结构
这DefaultBatchConfiguration
类已更新为默认提供“无资源”批处理基础设施(基于ResourcelessJobRepository
在 v5.2 中引入的实现)。这意味着它不再需要用于作业存储库的内存数据库(如 H2 或 HSQLDB),而这在以前是批量元数据存储所必需的。
此外,此更改将提高不使用元数据时批处理应用程序的默认性能,因为ResourcelessJobRepository
不需要任何数据库连接或事务。
最后,此更改将有助于减少批处理应用程序的内存占用,因为元数据存储不再需要内存数据库。
批量基础设施配置简化
在 v6 之前,一个重要的 Spring Batch 应用程序的典型配置非常复杂,需要大量的 bean:JobRepository
,JobLauncher
,JobExplorer
,JobOperator
,JobRegistry
,JobRegistrySmartInitializingSingleton
等等。这需要大量的配置代码,例如需要在两个JobRepository
和JobExplorer
.
在此版本中,进行了多项更改以简化批处理基础结构配置:
-
这
JobRepository
现在扩展了JobExplorer
接口,因此无需单独定义JobExplorer
豆。 -
这
JobOperator
现在扩展了JobLauncher
接口,因此无需单独定义JobLauncher
豆。 -
这
JobRegistry
现在足够智能,可以自动注册作业,因此无需定义单独的JobRegistrySmartInitializingSingleton
豆。
这减少了典型批处理应用程序所需的 Bean 数量并简化了配置代码。
面向块的处理模型的新实现
这不是一个新功能,而是面向块的处理模型的新实现。这个新实现是在 5.1 版中作为实验性添加引入的,现在在 6.0 版中作为稳定版提供。
新的实现在ChunkOrientedStep
类,它是ChunkOrientedTasklet
/ TaskletStep
类。
下面是一个示例,说明如何定义ChunkOrientedStep
通过使用其构建器:
@Bean
public Step chunkOrientedStep(JobRepository jobRepository, JdbcTransactionManager transactionManager,
ItemReader<Person> itemReader, ItemProcessor<Person, Person> itemProcessor, ItemWriter<Person> itemWriter) {
int chunkSize = 100;
return new ChunkOrientedStepBuilder<Person, Person>(jobRepository, transactionManager, chunkSize)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.build();
}
此外,容错功能调整如下:
-
重试功能现在基于 Spring Framework 7 中引入的重试功能,而不是以前的 Spring Retry 库
-
跳过功能已略微适应新实现,现在仅完全基于
SkipPolicy
接口
下面是一个快速示例,说明如何将重试和跳过功能与新的ChunkOrientedStep
:
@Bean
public Step faulTolerantChunkOrientedStep(JobRepository jobRepository, JdbcTransactionManager transactionManager,
ItemReader<Person> itemReader, ItemProcessor<Person, Person> itemProcessor, ItemWriter<Person> itemWriter) {
// retry policy configuration
int maxAttempts = 10;
var retrybaleExceptions = Set.of(TransientException.class);
RetryPolicy retryPolicy = RetryPolicy.builder()
.maxAttempts(maxAttempts)
.includes(retrybaleExceptions)
.build();
// skip policy configuration
int skipLimit = 50;
var skippableExceptions = Set.of(FlatFileParseException.class);
SkipPolicy skipPolicy = new LimitCheckingItemSkipPolicy(skipLimit, skippableExceptions);
// step configuration
int chunkSize = 100;
return new ChunkOrientedStepBuilder<Person, Person>(jobRepository, transactionManager, chunkSize)
.reader(itemReader)
.processor(itemProcessor)
.writer(itemWriter)
.faultTolerant()
.retryPolicy(retryPolicy)
.skipPolicy(skipPolicy)
.build();
}
有关如何从以前的实现迁移到新实现的更多详细信息,请参阅迁移指南。
新的命令行运算符
Spring Batch 提供了一个CommandLineJobRunner
从版本 1 开始。虽然这个运行器多年来很好地达到了它的目的,但它在可扩展性和定制性方面开始显示出一些局限性。已经报告了许多问题,例如静态初始化、处理选项和参数的非标准方式、缺乏可扩展性等。
此外,所有这些问题使得无法在 Spring Boot 中重用该运行器,这导致两个项目中的代码重复以及行为差异(如作业参数增量器行为差异),这让许多用户感到困惑。
此版本引入了CommandLineJobRunner
叫CommandLineJobOperator
,允许您从命令行作批处理作业(启动、停止、重新启动等),并且可自定义、可扩展并更新为 Spring Batch 6 中引入的新更改。
能够恢复失败的作业执行
在此版本之前,如果作业执行突然失败,则如果不手动更新数据库,则无法恢复它。这很容易出错,并且在不同的作业存储库中不一致(因为它需要一些 JDBC 数据库的 SQL 语句和一些 NoSQL 存储的自定义语句)。
此版本引入了一个名为recover
在JobOperator
接口,允许您在所有作业存储库中一致地恢复失败的作业执行。
弃用和修剪
与任何主要版本一样,某些功能已在 Spring Batch 6.0 中被弃用或删除。以下变化值得注意:
-
以前版本中所有已弃用的 API 和功能均已删除
-
模块化配置
@EnableBatchProcessing(modular = true)
已被弃用 -
此版本中已弃用多个 API,以简化核心 API 并缩小其范围
有关更多详细信息,请参阅迁移指南。