迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 >

Spring Batch 中的步骤范围

作者:迹忆客 最近更新:2023/08/14 浏览次数:

本文介绍了 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的官方文档。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便