Spring Batch 中的步骤范围
本文介绍了 Spring Batch 中 Step Scope 的工作原理。 Spring Batch 具有三个主要的高级组件:应用程序、Batch 核心和 Batch 基础架构。
Spring Batch 中的作业和步骤
作业是封装整个批处理的实体; 即,它位于工作层次结构的顶部。 每项作业都包含一个或多个步骤。
它是步骤实例的容器,其中每个步骤都有一个 ItemReader、ItemProcessor 和 ItemWriter。 作业包含的一些概念包括 JobInstance、JobParameters 和 JobExecution。
步骤是批处理作业的独立域对象,包含定义和控制批处理过程的所有必要信息。 与作业一样,步骤也有一个与作业中的 JobExecution 相关的 StepExecution。
Spring定义了两个作用域,即StepScope和JobScope。
Spring Batch 中的步骤范围
使用后期绑定的 Bean 必须始终以步骤作为范围进行声明。 这可以通过设置scope=“step”来完成,但是step范围不能与step bean一起使用。
如果需要,步骤中的组件应改为步骤范围。 在 Spring Batch 中,作业与 XML 配置文件或基于 Java 的配置连接,该配置称为 JobConfiguration。
下面显示的示例显示了在 XML 和 JAVA 中绑定到步骤范围。
XML 配置:
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{jobParameters[input.file.name]}" />
</bean>
基于Java的配置:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("
#{jobParameters[input.file.name]}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
StepScope 对象在很多方面都很有用。 原因之一是 StepScope 有助于定义 Bean 的寿命。
默认情况下,bean 范围是单例的。 当bean使用@singleton注释时,它将在开始时创建一次并在结束时销毁,但是StepScope是特定步骤所独有的,而不是单例。
通过将组件指定为 StepScope,spring 容器将为每个步骤启动一个新实例。 步骤范围 bean 的生命周期取决于步骤的生命周期。
在步骤作用域 bean 中,bean 将在每个步骤开始时创建并在每个步骤结束时销毁。 注释是@StepScope。
使用 StepScope 的另一个原因是当步骤并行执行时,因为它将隔离 bean 的状态。 通过这种方式,每个步骤中的每个线程都有自己的实例,并且不会修改其他线程管理的状态。
如果不是,多个线程将改变 bean 的状态,使其不一致。 此外,通过 StepScope,可以在执行参数的后期绑定时通过 stepExecutionContext 和 stepExecutionListener 在步骤之间传递信息。
因此,StepScope 帮助定义 bean 的生命周期并允许我们跨步骤传递数据。 以下示例显示了在 XML 和 JAVA 配置中使用 stepExecutionContext。
XML 配置:
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{stepExecutionContext['input.file.name']}" />
</bean>
基于Java的配置:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value(
"#{stepExecutionContext['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
我们讨论了 StepScope 对象在 Spring Batch 中的工作原理以及示例。 要了解更多关于Spring Batch的信息,可以参考Spring Batch的官方文档。