本节展示了 Spring Batch 5 的主要亮点。更多细节,请参考 迁移指南。
Spring Batch 5.0 中的新内容
本站( springdoc.cn )中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。 |
Spring Batch 5.0 有以下主要主题:
-
需要 Java 17
-
主要依赖的升级
-
批处理的基础设施配置更新
-
批处理测试配置更新
-
Job参数处理更新
-
Execution context 序列化更新
-
SystemCommandTasklet 更新
-
新特性
-
修剪
需要 Java 17
Spring Batch 在 Java 版本和第三方依赖方面都遵循Spring Framework的基线。随着Spring Batch 5的推出,Spring Framework版本将升级到Spring Framework 6,这需要Java 17。因此,Spring Batch的Java版本要求也将增加到Java 17。
主要依赖的升级
为了继续与Spring Batch使用的第三方库的支持版本进行整合,Spring Batch 5 正在将依赖全面更新为以下版本:
-
Spring Framework 6
-
Spring Integration 6
-
Spring Data 3
-
Spring AMQP 3
-
Spring for Apache Kafka 3
-
Micrometer 1.10
这个版本也标志着迁移到了:
-
Jakarta EE 9
-
Hibernate 6
批处理基础设施配置更新
Spring Batch 5包括以下基础设施配置更新:
数据源和事务管理器
历史上,Spring Batch提供了一个基 于 map 的 job repository 和 job explorer 的实现,以便与内存中的 job repository 一起工作。这些实现在版本4中被弃用,在版本5中被完全删除。推荐的替代方案是使用基于JDBC的实现,并使用嵌入式数据库,如H2、HSQL和其他。
在这个版本中,@EnableBatchProcessing
注解配置了一个基于 JDBC 的 JobRepository
,这需要在应用上下文中定义一个 DataSource
和 PlatformTransactionManager
Bean。DataSource
Bean 可以引用一个嵌入式数据库来与内存中的 job repository 一起工作。
事务管理器 Bean 的暴露
直到4.3版本,@EnableBatchProcessing
注解在应用程序上下文中暴露了一个事务管理器bean。虽然这在许多情况下很方便,但无条件地暴露事务管理器会干扰用户定义的事务管理器。在这个版本中,@EnableBatchProcessing
不再在应用程序上下文中暴露一个事务管理器Bean。
EnableBatchProcessing
中新增的注解属性
在这个版本中,@EnableBatchProcessing
注解提供了新的属性,以指定哪些组件和参数应被用于配置批处理基础结构 bean。例如,现在可以指定Spring Batch应在 job repository 中配置哪些数据源和事务管理器,具体如下:
@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,它们将被用来配置 job repository 和 job explorer。没有必要再定义一个自定义的 BatchConfigurer
,在这个版本中已经删除。
基础设施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();
}
}
在这个例子中,注入 Job
bean 定义中的 JobRepository
bean被定义在 DefaultBatchConfiguration
类中。自定义参数可以通过覆盖相应的 getter 来指定。例如,下面的例子显示了如何覆盖 job repository 和 job explorer 中使用的默认字符编码:
@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;
}
}
Job 参数处理的更新
支持任何类型作为 job 参数
这个版本增加了对使用任何类型作为 job 参数的支持,而不是像第四版那样只有4种预定义的类型(long、double、string、date)。 这一变化对工作参数在数据库中的持久化有影响(不再有每种预定义类型的4个不同列)。请检查 BATCH_JOB_EXECUTION_PARAMS 中的列变化,了解DDL变化。现在,参数类型的全称是字符串,以及参数值被保存为 String
。字符串被转换为标准 Spring 转换服务(conversion service)的参数类型。标准的转换服务可以用任何需要的 convert 来丰富,以将用户的特定类型转换为字符串。
默认的 job 参数转换
v4中 job 参数的默认符号被指定为如下:
[+|-]parameterName(parameterType)=value
其中 parameterType
是 [string,long,double,date]
之一。这种符号有局限性,有约束性,不能很好地使用环境变量,对Spring Boot也不友好。
在v5中,有两种方法来指定 job 参数:
默认符号
现在默认的符号指定如下:
parameterName=parameterValue,parameterType,identificationFlag
其中 parameterType
是参数类型的完全名称。Spring Batch 提供了 DefaultJobParametersConverter
来支持这种符号。
扩展符号
虽然默认符号很适合大多数使用情况,但当值包含逗号时,可能就不太方便了,例如。在这种情况下,可以使用扩展符号,其灵感来自于 Spring Boot 的 Json Application Properties,其指定方式如下:
parameterName='{"value": "parameterValue", "type":"parameterType", "identifying": "booleanValue"}'
其中 parameterType
是参数类型的完全名称。Spring Batch 提供了 JsonJobParametersConverter
来支持这种符号。
Execution context 序列化的更新
从v5开始,DefaultExecutionContextSerializer
被更新为将上下文 序列化为Base64,以及从 Base64 反序列化。
此外,由 @EnableBatchProcessing
或 DefaultBatchConfiguration
配置的默认 ExecutionContextSerializer
已从 JacksonExecutionContextStringSerializer
改为 DefaultExecutionContextSerializer
。对Jackson的依赖是可选的。为了使用 JacksonExecutionContextStringSerializer
,应该在classpath中添加 jackson-core
。
SystemCommandTasklet 更新
在这个版本中,SystemCommandTasklet
被重新审视,并做了如下修改:
-
引入了一个名为
CommandRunner
的新策略接口,以便将命令的执行与小任务的执行解耦。默认实现是JvmCommandRunner
,它使用java.lang.Runtime#exec
API来运行系统命令。这个接口可以被实现为使用任何其他API来运行系统命令。 -
运行命令的方法现在接受一个代表命令及其参数的
String
数组。不再需要对命令进行标记,也不需要做任何预处理。这一变化使API更加直观,而且不容易出错。
批处理测试配置的更新
Spring Batch 5 包括以下测试配置更新:
JobExplorer 和 JobOperator 中的事务支持
这个版本在通过 JobExplorerFactoryBean
创建的 JobExplorer
中引入了事务支持。现在,在查询批处理元数据时,可以指定使用哪个事务管理器来驱动只读事务,以及自定义事务属性。
同样的事务支持通过一个名为 JobOperatorFactoryBean
的新工厂 bean 被添加到 JobOperator
中。
用 EnableBatchProcessing 自动注册一个 JobOperator
从第4版开始,EnableBatchProcessing
注解提供了启动 Spring Batch job 所需的所有基本基础设施Bean。然而,它并没有注册一个 job operator bean,这是停止、重新启动和放弃 job 执行的主要入口。
虽然这些工具不像启动 job 那样经常使用,但在 application context 中自动添加 job operator,可以避免终端用户手动配置这种 bean。
改进对 Java Record 的支持
对 Java Record 作为面向块的 step 中的项目的支持最初是在v4.3中引入的,但由于v4以Java 8为基线,这种支持很有限。最初的支持是基于反射技巧来创建 Java Record 并将数据填充到其中,而无法访问在Java 16中最终确定的 java.lang.Record
API。
现在 v5 以 Java 17 为基准,我们通过在框架的不同部分利用 Record
API来改进 Spring Batch 中的 Record 支持。例如,FlatFileItemReaderBuilder
现在能够检测 item 类型是 record 还是普通类,并相应地配置相应的 FieldSetMapper
实现(即 record 的 RecordFieldSetMapper
和普通类的 BeanWrapperFieldSetMapper
)。这里的目标是使所需 FieldSetMapper
类型的配置对用户透明。
用 Micrometer 进行 Batch trace
随着 Micrometer 1.10 的升级,除了批处理指标,你现在还可以获得批处理 trace。Spring Batch 将为每个 job 创建一个 span,为一个 job 中的每个 step 创建一个span。这种 trace 元数据可以被收集起来,并在 Zipkin 等仪表盘上查看。
此外,这个版本还引入了新的指标,如当前的活动 step,以及通过所提供的 JobLauncher
的 job 启动计数。
Java 8 的功能更新
我们利用这个重要版本的机会,用Java 8+的功能来改进代码库,例如:
-
在接口中使用默认方法,废除 "support" 类(见 issue 3924)。
-
在 public API 中适当添加
@FunctionalInterface
(见 issue 4107)。 -
增加对使用
Date
和Time
API 的类型作为 job 参数的支持。(见 issue 1035)
完全支持 MariaDB 作为一个独立的产品
直到 v4.3,Spring Batch 为 MariaDB 提供支持,将其视为 MySQL。在这个版本中,MariaDB 被视为一个独立的产品,有自己的 DDL 脚本和 DataFieldMaxValueIncrementer
。
用于 Spring Batch 模块的新 Maven 物料清单
这个功能已经被要求了好几次,终于在v5中发布了。 现在可以使用新增加的 Maven BOM 来导入具有一致版本号的Spring Batch模块。
默认为UTF-8
多年来,在框架的不同领域都报告了一些与字符编码有关的问题,如基于文件的 item reader 和 writer 之间的默认编码不一致,在执行环境中处理多字节字符时的序列化/反序列化问题,等等。
本着与 JEP 400 相同的精神,并遵循 UTF-8 manifesto,该版本将框架的所有区域的默认编码更新为UTF-8,并确保该默认编码可根据需要进行配置。
完全支持GraalVM native
我们从 v4.2 开始努力提供支持,使用 GraalVM 原生镜像编译器将 Spring Batch 应用程序编译为本地可执行文件,并在v4.3中作为实验性文件交付。
在这个版本中,通过提供必要的 runtime hint,native 支持得到了极大的改善,可以用 GraalVM native 编译 Spring Batch 应用程序,现在被认为已经脱离了测试阶段。
修剪
Spring Batch 5 删除了一些不再需要的项目,包括:
API的废弃和删除
在这个主要版本中,所有在以前的版本中被废弃的API都已经被删除。此外,一些API在v5.0中已经被废弃,并计划在v5.2中删除。最后,由于实际原因,一些API被转移或删除,但没有被废弃。
关于这些变化的更多细节,请参考 迁移指南。
移除 SQLFire 的支持
SqlFire 已经被宣布从2014年11月1日起停止使用。对 SQLFire 作为 job repository 的支持在v4.3版本中被废弃,在v5.0版本中被移除。
移除 GemFire 的支持
基于 Spring Data 停止对 Apache Geode 的支持 的决定,Spring Batch中对Geode的支持被移除。这些代码被转移到 spring-batch-extensions repository,作为社区驱动的努力。