Spring Batch 5.0 中的新增功能

Spring Batch 5.0 中的新增功能

Spring Batch 5.0 具有以下主要主题:spring-doc.cadn.net.cn

Java 17 要求

Spring Batch 遵循 Spring Framework 的 Java 版本和第三方依赖项基线。 在 Spring Batch 5 中,Spring Framework 版本将升级到需要 Java 17 的 Spring Framework 6。 因此,Spring Batch 的 Java 版本要求也增加到 Java 17。spring-doc.cadn.net.cn

主要依赖项升级

要继续与 Spring Batch 使用的受支持版本的第三方库集成, Spring Batch 5 正在将依赖项全面更新到以下版本:spring-doc.cadn.net.cn

此版本还标志着迁移到:spring-doc.cadn.net.cn

Batch 基础架构配置更新

Spring Batch 5 包括以下基础结构配置更新:spring-doc.cadn.net.cn

数据源和事务管理器需求更新

从历史上看, Spring Batch 提供了一个基于 map 的作业存储库和作业浏览器实现 内存中作业存储库。这些实现在版本 4 中已弃用,并在版本 5 中完全删除。 推荐的替代方法是将基于 JDBC 的实现与嵌入式数据库(如 H2、HSQL 等)一起使用。spring-doc.cadn.net.cn

在此版本中,@EnableBatchProcessing注解配置基于 JDBC 的JobRepository,这需要DataSourcePlatformTransactionManager要在应用程序上下文中定义的 bean。这DataSource豆 可以引用嵌入式数据库以使用内存中作业存储库。spring-doc.cadn.net.cn

事务管理器 Bean Exposure

在版本 4.3 之前,@EnableBatchProcessing注解在应用程序中公开了事务管理器 Bean 上下文。虽然这在许多情况下很方便,但事务管理器的无条件暴露可以 干扰用户定义的事务管理器。在此版本中,@EnableBatchProcessing不再公开 事务管理器 Bean。spring-doc.cadn.net.cn

EnableBatchProcessing 中的新 annotation 属性

在此版本中,@EnableBatchProcessingannotation 提供了新的属性来指定 组件和参数应用于配置 Batch 基础结构 Bean。例如 现在可以指定 Spring Batch 应该配置的数据源和事务管理器 在作业存储库中,如下所示:spring-doc.cadn.net.cn

@Configuration
@EnableBatchProcessing(dataSourceRef = "batchDataSource", transactionManagerRef = "batchTransactionManager")
public class MyJobConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("myJob", jobRepository)
				//define job flow as needed
				.build();
	}

}

在此示例中,batchDataSourcebatchTransactionManager在应用程序上下文中引用 bean, ,它将用于配置 Job 存储库和 Job Explorer。无需定义 习惯BatchConfigureranymore,该版本已在此版本中删除。spring-doc.cadn.net.cn

基础结构 bean 的新配置类

在此版本中,新增了名为DefaultBatchConfiguration可用作 用@EnableBatchProcessing用于基础结构 Bean 的配置。此类提供基础设施 具有 default 配置的 bean,可以根据需要进行自定义。以下代码段显示了典型用法 此类的:spring-doc.cadn.net.cn

@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("myJob", jobRepository)
				//define job flow as needed
				.build();
	}

}

在此示例中,JobRepositorybean 注入Jobbean 定义在DefaultBatchConfiguration类。可以通过覆盖相应的 getter 来指定自定义参数。例如,以下示例显示了 如何覆盖 Job 存储库和 Job Explorer 中使用的默认字符编码:spring-doc.cadn.net.cn

@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {

	@Bean
	public Job job(JobRepository jobRepository) {
		return new JobBuilder("job", jobRepository)
				// define job flow as needed
				.build();
	}

	@Override
	protected Charset getCharset() {
		return StandardCharsets.ISO_8859_1;
	}
}

处理更新的作业参数

支持将任何类型作为作业参数

此版本添加了对使用任何类型作为作业参数的支持,而不仅仅是 4 个预定义的 类型 (long, double, string, date) 与 v4 中相同。此更改会影响作业参数的方式 保存在数据库中(每个预定义类型不再有 4 个不同的列)。 请检查 BATCH_JOB_EXECUTION_PARAMS 中的列更改以了解 DDL 更改。参数类型的完全限定名称现在保留为String, 以及 parameter 值。字符串文字被转换为具有标准 Spring 转换服务。标准转换服务可以通过任何所需的转换器来丰富 将用户特定类型与 String 文本相互转换。spring-doc.cadn.net.cn

默认作业参数转换

v4 中作业参数的默认表示法指定如下:spring-doc.cadn.net.cn

[+|-]parameterName(parameterType)=value

哪里parameterType是其中之一[string,long,double,date].这种符号是有限的、有约束的、 不能很好地与环境变量配合使用,并且对 Spring Boot 不友好。spring-doc.cadn.net.cn

在 v5 中,有两种方法可以指定作业参数:spring-doc.cadn.net.cn

默认表示法

现在,默认表示法的指定方式如下:spring-doc.cadn.net.cn

parameterName=parameterValue,parameterType,identificationFlag

哪里parameterType是参数类型的完全限定名称。Spring Batch 提供 这DefaultJobParametersConverter来支持这种表示法。spring-doc.cadn.net.cn

扩展表示法

虽然默认表示法非常适合大多数用例,但在 例如,该值包含逗号。在这种情况下,可以使用扩展符号,这是受启发的 通过 Spring Boot 的 Json Application Properties 进行指定,并按如下方式指定:spring-doc.cadn.net.cn

parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'

哪里parameterType是参数类型的完全限定名称。Spring Batch 提供了JsonJobParametersConverter来支持这种表示法。spring-doc.cadn.net.cn

执行上下文序列化更新

从 v5 开始,DefaultExecutionContextSerializer已更新为将上下文序列化/反序列化为 Base64 或从 Base64 序列化上下文。spring-doc.cadn.net.cn

此外,默认的ExecutionContextSerializer配置者@EnableBatchProcessingDefaultBatchConfiguration已从JacksonExecutionContextStringSerializerDefaultExecutionContextSerializer.对 Jackson成为可选项。要使用JacksonExecutionContextStringSerializer,jackson-core应该添加 添加到 Classpath 中。spring-doc.cadn.net.cn

SystemCommandTasklet 更新

SystemCommandTasklet在此版本中进行了重新访问,并进行了如下更改:spring-doc.cadn.net.cn

  • 一个名为CommandRunner是为了解耦命令执行 从 tasklet 执行。默认实现是JvmCommandRunner它使用java.lang.Runtime#exec用于运行系统命令的 API。可以实现此接口以使用任何其他 API 来运行系统命令。spring-doc.cadn.net.cn

  • 运行命令的方法现在接受一个 'String' 数组,表示命令及其参数。 不再需要对命令进行标记化或进行任何预处理。此更改使 API 更加直观, 并且不易出错。spring-doc.cadn.net.cn

批量测试配置更新

Spring Batch 5 包括以下测试配置更新:spring-doc.cadn.net.cn

从测试实用程序中删除自动装配

在版本 4.3 之前,JobLauncherTestUtilsJobRepositoryTestUtils使用 自动装配待测作业以及 test 数据源,以便于 测试基础设施设置。虽然这对于大多数使用案例来说很方便,但它 结果导致多个测试上下文出现多个问题,其中多个作业或 定义了多个数据源。spring-doc.cadn.net.cn

在此版本中,我们引入了一些更改以删除此类 dependencies 的 Frameworks 中,以避免在导入这些实用程序时出现任何问题 手动或通过@SpringBatchTest注解。spring-doc.cadn.net.cn

迁移到 JUnit Jupiter

在这个版本中,Spring Batch 的整个测试套件已经迁移到 JUnit 5。 虽然这不会直接影响最终用户,但它有助于 Batch 团队以及 社区贡献者使用下一代 JUnit 编写更好的测试。spring-doc.cadn.net.cn

新功能

JobExplorer 和 JobOperator 中的事务支持

该版本在JobExplorer创建方式 这JobExplorerFactoryBean.现在可以指定哪个事务管理器 用于在查询 Batch 元数据时驱动只读事务,以及 自定义交易属性。spring-doc.cadn.net.cn

相同的事务支持已添加到JobOperator通过新的工厂 Bean 叫JobOperatorFactoryBean.spring-doc.cadn.net.cn

使用 EnableBatchProcessing 自动注册 JobOperator

从版本 4 开始,EnableBatchProcessingAnnotation 提供了所有基本基础设施 启动 Spring Batch 作业所需的 bean。但是,它没有注册作业 operator bean,这是停止、重新启动和放弃任务执行的主要入口点。spring-doc.cadn.net.cn

虽然这些实用程序的使用频率不如启动 Job Job,但会自动添加 Job 运算符 在应用程序上下文中,可以避免手动配置这样的 bean 由最终用户提供。spring-doc.cadn.net.cn

改进的 Java 记录支持

在 v4.3 中最初引入了对 Java 记录作为面向块的步骤中的项目的支持。 但由于 v4 以 Java 8 为基准,因此这种支持是有限的。最初的支持是 基于 Reflection 技巧创建 Java 记录并用数据填充它们,而无需访问java.lang.RecordAPI 在 Java 16 中完成。spring-doc.cadn.net.cn

现在,v5 以 Java 17 为基准,我们利用RecordAPI 在框架的不同部分。例如,FlatFileItemReaderBuilder现在能够 检测项类型是 Record 还是常规类,并配置对应的FieldSetMapper相应地实施 (IERecordFieldSetMapperfor records 和BeanWrapperFieldSetMapper常规 类)。这里的目标是将所需的FieldSetMapper键入 transparent to the user。spring-doc.cadn.net.cn

使用 Micrometer 进行批次追踪

升级到 Micrometer 1.10 后,除了 Batch 指标之外,您现在还可以获得 Batch 跟踪。 Spring Batch 将为每个作业创建一个 span,并为 job 中的每个步骤创建一个 span。此跟踪 例如,可以在 Zipkin 等仪表板上收集和查看元数据。spring-doc.cadn.net.cn

此外,此版本还引入了新指标,例如当前活动步骤以及任务启动计数 通过提供的JobLauncher.spring-doc.cadn.net.cn

Java 8 功能更新

我们利用这个主要版本的机会,使用 Java 8+ 中的功能改进了代码库,例如:spring-doc.cadn.net.cn

支持 SAP HANA 作业存储库

此版本引入了对 SAP HANA 的支持,作为作业存储库的额外支持数据库。spring-doc.cadn.net.cn

完全支持 MariaDB 作为单独的产品

直到 v4.3,Spring Batch 通过将 MariaDB 视为 MySQL 来提供对 MariaDB 的支持。在此版本中,MariaDB 被视为具有自己的 DDL 脚本的独立产品,并且DataFieldMaxValueIncrementer.spring-doc.cadn.net.cn

Spring Batch 模块的新 Maven 物料清单

此功能已多次请求,最终在 v5 中提供。现在可以使用新的 新增 Maven BOM,可导入版本号一致的 Spring Batch 模块。spring-doc.cadn.net.cn

默认为 UTF-8

多年来,在不同的 框架的领域,例如基于文件的项目读取器之间的默认编码不一致 和 writers,处理多字节字符时的序列化/反序列化问题 在执行上下文中,等等。spring-doc.cadn.net.cn

本着与 JEP 400 相同的精神并遵循 UTF-8 宣言,此版本更新了默认编码 设置为 UTF-8,并确保此默认值可根据需要进行配置。spring-doc.cadn.net.cn

完整的 GraalVM 原生支持

为支持将 Spring Batch 应用程序编译为本机可执行文件所做的努力 使用 GraalVM 本机映像编译器从 v4.2 开始,并在 v4.3 中作为实验性提供。spring-doc.cadn.net.cn

在此版本中,通过提供必要的运行时,本机支持得到了显著改进 提示使用 GraalVM 原生编译 Spring Batch 应用程序,现在被认为已结束测试阶段。spring-doc.cadn.net.cn

执行上下文 Meta-data 改进

除了 Spring Batch 在运行时已经存在于执行上下文中的内容之外 信息(如 Step Type、重启标志等)中,该版本在 execution context,这是用于序列化上下文的 Spring Batch 版本。spring-doc.cadn.net.cn

虽然这似乎是一个细节,但在调试升级问题时,它具有巨大的附加价值 执行上下文序列化和反序列化。spring-doc.cadn.net.cn

改进的文档

在这个版本中,文档被更新为使用 Spring Asciidoctor Backend。 此后端可确保 portfolio 中的所有项目都遵循相同的文档样式。 为了与其他项目保持一致,更新了 Spring Batch 的参考文档 以在此版本中使用此后端。spring-doc.cadn.net.cn

修剪

Spring Batch 5 删除了许多不再需要的项目,包括:spring-doc.cadn.net.cn

API 弃用和移除

在此主要版本中,已删除以前版本中弃用的所有 API。 此外,某些 API 已在 v5.0 中弃用,并计划在 v5.2 中删除。 最后,出于实际原因,一些 API 已被移动或删除,但未弃用。spring-doc.cadn.net.cn

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

SQLFire 支持删除

SqlFire 已宣布自 2014 年 11 月 1 日起停止使用。支持 SQLFire 作为作业存储库 在版本 v4.3 中已弃用,并在版本 v5.0 中删除。spring-doc.cadn.net.cn

GemFire 支持移除

根据 [决定停止](https://github.com/spring-projects/spring-data-geode#notice ) 对 Spring Data for Apache Geode 的支持,Spring Batch 中对 Geode 的支持已被删除。 代码已移至 [spring-batch-extensions](https://github.com/spring-projects/spring-batch-extensions) 存储库 作为社区驱动的努力。spring-doc.cadn.net.cn

JSR-352 实现删除

由于缺乏采用,JSR-352 的实现在此版本中已停止。spring-doc.cadn.net.cn