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