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,
将用于配置作业存储库和作业资源管理器。无需定义
习惯BatchConfigurer
anymore,在此版本中已删除。
基础架构 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
在Job
bean 定义在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
相应地实施(即RecordFieldSetMapper
for 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) 存储库 作为社区驱动的努力。