Spring Batch 6.0.0-M2 现已发布,提供了以下功能和改进:
- 依赖项升级
- chunk-oriented 处理模型的新实现
- 能够恢复突然失败的作业执行
有关完整的更改列表,可查看发行说明。
Dependencies upgrade
在此里程碑版本中,Spring 依赖项升级到以下版本:
- Spring Framework: 7.0.0-M8
- Spring Integration: 7.0.0-M2
- Spring AMQP: 4.0.0-M4
- Spring Kafka: 4.0.0-M4
- Spring Data: 4.0.0-M5
- Spring Ldap: 4.0.0-M2
- Micrometer: 1.16.0-M2
注意,此版本与 Java 17+ 兼容。
chunk-oriented 处理模型的新实现
这并非新功能,而是对 chunk-oriented 处理模型的全新增强实现。此新实现最初在 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();
}
此外,fault-tolerance 功能进行了如下调整:
- 重试功能现在基于 Spring Framework 7 中引入的重试功能,而不是以前的 Spring Retry 库
- 跳过功能已根据新实现略作调整,现在完全基于
SkipPolicy
interface
以下是使用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();
}
有关如何从以前的实现迁移到新的实现的更多详细信息,可参阅迁移指南。
恢复失败的作业执行的能力
在 v6 之前,如果作业执行突然失败,除非手动更新数据库,否则无法恢复。这很容易出错,并且在不同的作业存储库之间不一致(因为对于 JDBC 数据库,它需要一些 SQL 语句,而对于 NoSQL 存储,则需要一些自定义语句)。
此里程碑版本引入了JobOperator
interface 中的一个新方法recover
,允许用户在所有作业存储库中一致地恢复失败的作业执行。