此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Batch 文档 5.2.2spring-doc.cadn.net.cn

Spring Batch 6 中的新增功能

依赖项升级

在此主要版本中,Spring 依赖项已升级到以下版本:spring-doc.cadn.net.cn

批处理基础结构配置改进

批处理基础结构配置的新注释和类

在 v6 之前,@EnableBatchProcessing注释与基于 JDBC 的基础设施相关联。现在情况已不再如此。引入了两个新的注释来配置基础作业存储库:@EnableJdbcJobRepository@EnableMongoJobRepository.spring-doc.cadn.net.cn

从 v6 开始,@EnableBatchProcessing允许您为批处理基础架构配置通用属性,而可以使用新的专用注释指定特定于存储的属性。spring-doc.cadn.net.cn

以下是如何使用这些注释的示例:spring-doc.cadn.net.cn

@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已更新,引入了两个新的配置类来定义特定于商店的属性:JdbcDefaultBatchConfigurationMongoDefaultBatchConfiguration. 这些类可用于以编程方式配置每个作业存储库以及其他批处理基础架构 Bean 的特定属性。spring-doc.cadn.net.cn

默认情况下的无资源批处理基础结构

DefaultBatchConfiguration类已更新为默认提供“无资源”批处理基础设施(基于ResourcelessJobRepository在 v5.2 中引入的实现)。这意味着它不再需要用于作业存储库的内存数据库(如 H2 或 HSQLDB),而这在以前是批量元数据存储所必需的。spring-doc.cadn.net.cn

此外,此更改将提高不使用元数据时批处理应用程序的默认性能,因为ResourcelessJobRepository不需要任何数据库连接或事务。spring-doc.cadn.net.cn

最后,此更改将有助于减少批处理应用程序的内存占用,因为元数据存储不再需要内存数据库。spring-doc.cadn.net.cn

批量基础设施配置简化

在 v6 之前,一个重要的 Spring Batch 应用程序的典型配置非常复杂,需要大量的 bean:JobRepository,JobLauncher,JobExplorer,JobOperator,JobRegistry,JobRegistrySmartInitializingSingleton等等。这需要大量的配置代码,例如需要在两个JobRepositoryJobExplorer.spring-doc.cadn.net.cn

在此版本中,进行了多项更改以简化批处理基础结构配置:spring-doc.cadn.net.cn

  • JobRepository现在扩展了JobExplorer接口,因此无需单独定义JobExplorer豆。spring-doc.cadn.net.cn

  • JobOperator现在扩展了JobLauncher接口,因此无需单独定义JobLauncher豆。spring-doc.cadn.net.cn

  • JobRegistry现在足够智能,可以自动注册作业,因此无需定义单独的JobRegistrySmartInitializingSingleton豆。spring-doc.cadn.net.cn

这减少了典型批处理应用程序所需的 Bean 数量并简化了配置代码。spring-doc.cadn.net.cn

面向块的处理模型的新实现

这不是一个新功能,而是面向块的处理模型的新实现。这个新实现是在 5.1 版中作为实验性添加引入的,现在在 6.0 版中作为稳定版提供。spring-doc.cadn.net.cn

新的实现在ChunkOrientedStep类,它是ChunkOrientedTasklet / TaskletStep类。spring-doc.cadn.net.cn

下面是一个示例,说明如何定义ChunkOrientedStep通过使用其构建器:spring-doc.cadn.net.cn

@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-doc.cadn.net.cn

下面是一个快速示例,说明如何将重试和跳过功能与新的ChunkOrientedStep:spring-doc.cadn.net.cn

@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-doc.cadn.net.cn

新的命令行运算符

Spring Batch 提供了一个CommandLineJobRunner从版本 1 开始。虽然这个运行器多年来很好地达到了它的目的,但它在可扩展性和定制性方面开始显示出一些局限性。已经报告了许多问题,例如静态初始化、处理选项和参数的非标准方式、缺乏可扩展性等。spring-doc.cadn.net.cn

此外,所有这些问题使得无法在 Spring Boot 中重用该运行器,这导致两个项目中的代码重复以及行为差异(如作业参数增量器行为差异),这让许多用户感到困惑。spring-doc.cadn.net.cn

此版本引入了CommandLineJobRunnerCommandLineJobOperator,允许您从命令行作批处理作业(启动、停止、重新启动等),并且可自定义、可扩展并更新为 Spring Batch 6 中引入的新更改。spring-doc.cadn.net.cn

能够恢复失败的作业执行

在此版本之前,如果作业执行突然失败,则如果不手动更新数据库,则无法恢复它。这很容易出错,并且在不同的作业存储库中不一致(因为它需要一些 JDBC 数据库的 SQL 语句和一些 NoSQL 存储的自定义语句)。spring-doc.cadn.net.cn

此版本引入了一个名为recoverJobOperator接口,允许您在所有作业存储库中一致地恢复失败的作业执行。spring-doc.cadn.net.cn

弃用和修剪

与任何主要版本一样,某些功能已在 Spring Batch 6.0 中被弃用或删除。以下变化值得注意:spring-doc.cadn.net.cn

有关更多详细信息,请参阅迁移指南spring-doc.cadn.net.cn