Spring Batch 5.0 中的新增功能
Spring Batch 5.0 中的新增功能
Spring Batch 5.0 有以下几大主题:
-
Java 17 要求
-
主要依赖项升级
-
批量基础结构配置更新
-
批量测试配置更新
-
作业参数处理更新
-
执行上下文序列化更新
-
SystemCommandTasklet 更新
-
新功能
-
修剪
Java 17 要求
Spring Batch 遵循 Spring Framework 的 Java 版本和第三方依赖项的基线。 在 Spring Batch 5 中,Spring Framework 版本正在升级到 Spring Framework 6,这需要 Java 17。 因此,Spring Batch 的 Java 版本要求也在增加到 Java 17。
主要依赖项升级
要继续与 Spring Batch 使用的第三方库的受支持版本集成, Spring Batch 5 正在将依赖项全面更新到以下版本:
-
Spring 框架 6
-
弹簧集成 6
-
弹簧数据 3
-
Spring AMQP 3
-
适用于 Apache Kafka 3 的 Spring
-
千分尺 1.10
此版本还标记了迁移到:
-
雅加达 EE 9
-
休眠 6
批量基础结构配置更新
Spring Batch 5 包括以下基础设施配置更新:
数据源和事务管理器要求更新
从历史上看,Spring Batch 提供了一个基于映射的作业存储库和作业资源管理器实现来使用 内存中作业存储库。这些实现在版本 4 中被弃用,并在版本 5 中完全删除。 建议的替代方法是将基于 JDBC 的实现与嵌入式数据库一起使用,例如 H2、HSQL 等。
在此版本中,@EnableBatchProcessing注释配置基于 JDBC 的JobRepository,这需要一个DataSource和PlatformTransactionManager要在应用程序上下文中定义的 bean。这DataSource豆
可以引用嵌入式数据库来处理内存中的作业存储库。
事务管理器 Bean 暴露
在 4.3 版本之前,@EnableBatchProcessing在应用程序中公开事务管理器 Bean 的注释
上下文。虽然这在许多情况下很方便,但事务管理器的无条件暴露可以
干扰用户定义的事务管理器。在此版本中,@EnableBatchProcessing不再公开
事务管理器 bean 的 bean。
EnableBatchProcessing 中的新注释属性
在此版本中,@EnableBatchProcessing注释提供了新的属性来指定哪些
组件和参数应用于配置 Batch 基础架构 Bean。例如
现在可以指定 Spring Batch 应配置的数据源和事务管理器
在作业存储库中,如下所示:
@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();
}
}
在此示例中,batchDataSource和batchTransactionManager在应用程序上下文中引用 bean,
将用于配置作业存储库和作业资源管理器。无需定义
习惯BatchConfigureranymore,在此版本中已删除。
基础架构 Bean 的新配置类
在此版本中,名为DefaultBatchConfiguration可用作替代品
用@EnableBatchProcessing用于配置基础架构 Bean。此类提供基础结构
具有默认配置的 bean,可以根据需要进行自定义。以下代码段显示了典型用法
本类:
@Configuration
class MyJobConfiguration extends DefaultBatchConfiguration {
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("myJob", jobRepository)
//define job flow as needed
.build();
}
}
在此示例中,JobRepository在Jobbean 定义在DefaultBatchConfiguration类。可以通过覆盖相应的 getter 来指定自定义参数。例如,以下示例显示
如何覆盖作业存储库和作业资源管理器中使用的默认字符编码:
@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,
以及参数值。字符串文字转换为具有标准
Spring 转换服务。标准转换服务可以通过任何所需的转换器来丰富
将用户特定类型转换为字符串文字或从字符串文字转换。
默认作业参数转换
v4 中作业参数的默认表示法指定如下:
[+|-]parameterName(parameterType)=value
哪里parameterType是其中之一[string,long,double,date].这种表示法是有限的,约束的,
不能很好地与环境变量配合使用,并且对 Spring Boot 不友好。
在 v5 中,有两种方法可以指定作业参数:
默认符号
默认表示法现在指定如下:
parameterName=parameterValue,parameterType,identificationFlag
哪里parameterType是参数类型的完全限定名称。Spring Batch 提供 这DefaultJobParametersConverter以支持此表示法。
扩展符号
虽然默认表示法非常适合大多数用例,但当例如,该值包含逗号。在这种情况下,可以使用扩展表示法,该表示法的灵感来自Spring Boot 的 Json 应用程序属性,指定如下:
parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'
哪里parameterType是参数类型的完全限定名称。Spring Batch 提供JsonJobParametersConverter以支持此表示法。
执行上下文序列化更新
从 v5 开始,DefaultExecutionContextSerializer已更新为将上下文序列化/反序列化到 Base64 或从 Base64 反序列化。
此外,默认的ExecutionContextSerializer配置者@EnableBatchProcessing或DefaultBatchConfiguration从JacksonExecutionContextStringSerializer自DefaultExecutionContextSerializer. 对Jackson 的依赖项是可选的。为了使用JacksonExecutionContextStringSerializer,jackson-core应该将添加到类路径中。
SystemCommandTasklet 更新
这SystemCommandTasklet在此版本中重新审视并更改如下:
-
名为
CommandRunner引入是为了将命令执行与 tasklet 执行解耦。默认实现是JvmCommandRunner它使用java.lang.Runtime#exec用于运行系统命令的 API。可以实现此接口以使用任何其他 API 来运行系统命令。 -
运行该命令的方法现在接受一个表示命令及其参数的“String”数组。不再需要对命令进行标记化或进行任何预处理。此更改使 API 更加直观,并且不易出错。
批量测试配置更新
Spring Batch 5 包括以下测试配置更新:
JobExplorer 和 JobOperator 中的事务支持
此版本在JobExplorer通过
这JobExplorerFactoryBean.现在可以指定哪个事务管理器
用于在查询 Batch 元数据时驱动仅就绪事务,以及
自定义事务属性。
相同的事务支持已添加到JobOperator通过新的工厂豆
叫JobOperatorFactoryBean.
使用 EnableBatchProcessing 自动注册 JobOperator
从版本 4 开始,EnableBatchProcessing注释提供了所有基本基础设施
启动 Spring Batch 作业所需的 bean。但是,它没有注册工作
operator bean,这是停止、重新启动和放弃作业执行的主要入口点。
虽然这些实用程序的使用频率不如启动作业,但会自动添加作业运算符 在应用程序上下文中,对于避免手动配置此类 Bean 非常有用 由最终用户。
改进的 Java 记录支持
对 Java 记录作为面向块的步骤中的项的支持最初是在 v4.3 中引入的,
但由于 v4 以 Java 8 为基准,因此这种支持受到限制。最初的支持是
基于反射技巧来创建 Java 记录并用数据填充它们,而无需访问java.lang.Record在 Java 16 中最终确定的 API。
现在 v5 以 Java 17 为基准,我们通过利用Record框架不同部分的 API。例如,FlatFileItemReaderBuilder现在能够
检测项目类型是记录类还是常规类,并配置相应的FieldSetMapper相应地实施(即RecordFieldSetMapperfor records 和BeanWrapperFieldSetMapper对于常规
类)。这里的目标是配置所需的FieldSetMapper类型对用户透明。
使用千分尺进行批量跟踪
升级到 Micrometer 1.10 后,除了批处理指标之外,您现在还可以获得批处理跟踪。 Spring Batch 将为每个作业创建一个跨度,并为作业中的每个步骤创建一个跨度。此跟踪 例如,可以在 Zipkin 等仪表板上收集和查看元数据。
此外,此版本还引入了新的指标,例如当前活动步骤以及作业启动计数
通过提供的JobLauncher.
完全支持 MariaDB 作为单独的产品
直到 v4.3 之前,Spring Batch 通过将 MariaDB 视为 MySQL 来提供对 MariaDB 的支持。在此版本中,MariaDB被视为一个独立的产品,具有自己的 DDL 脚本和DataFieldMaxValueIncrementer.
完整的 GraalVM 原生支持
为将 Spring Batch 应用程序编译为本机可执行文件提供支持的努力 使用 GraalVM 本机映像编译器已从 v4.2 开始,并在 v4.3 中作为实验性版本发布。
在此版本中,通过提供必要的运行时,本机支持得到了显着改进 使用 GraalVM 本机编译 Spring Batch 应用程序的提示,现在被认为已过测试版。
修剪
Spring Batch 5 删除了许多不再需要的项目,包括:
弃用和删除 API
在此主要版本中,删除了以前版本中已弃用的所有 API。 此外,某些 API 已在 v5.0 中弃用,并计划在 v5.2 中删除。 最后,出于实际原因,一些 API 已被移动或删除,而没有弃用。
有关这些更改的更多详细信息,请参阅迁移指南。
移除 GemFire 支撑
基于 [决定停止](https://github.com/spring-projects/spring-data-geode#notice ) 对 Apache Geode 的 Spring Data 的支持,删除了 Spring Batch 中对 Geode 的支持。 代码已移至 [spring-batch-extensions](https://github.com/spring-projects/spring-batch-extensions) 存储库 作为社区驱动的努力。