Spring Batch のステップ スコープ

Siddharth Bishnoi 2023年10月12日
  1. Spring バッチのジョブとステップ
  2. Spring Batch のステップ スコープ
Spring Batch のステップ スコープ

このチュートリアルでは、Spring Batch での Step Scope の動作について説明します。 Spring Batch には、アプリケーション、バッチ コア、バッチ インフラストラクチャの 3つの主要な高レベル コンポーネントがあります。

Spring バッチのジョブとステップ

ジョブは、バッチ処理全体をカプセル化するエンティティです。 つまり、ジョブ階層の最上位にあります。 すべてのジョブには、1つ以上のステップが含まれます。

これは、各ステップに 1つの ItemReaderItemProcessor、および ItemWriter があるステップ インスタンスのコンテナーです。 ジョブに含まれる概念には、JobInstanceJobParameters、および JobExecution があります。

ステップは、バッチ プロセスを定義および制御するために必要なすべての情報を含む、バッチ ジョブの独立したドメイン オブジェクトです。 Job と同様に、Step には、Job のように JobExecution と相関する StepExecution があります。

Spring は StepScopeJobScope という 2つのスコープを定義します。

Spring Batch のステップ スコープ

遅延バインディングを使用する Bean は、常にステップをスコープとして宣言する必要があります。 これは、scope="step" を設定することで実行できますが、ステップ Bean でステップ スコープを使用することはできません。

必要に応じて、ステップ内のコンポーネントをステップ スコープにする必要があります。 Spring Batch では、Job は 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 オブジェクトは多くの点で便利です。 その理由の 1つは、StepScope が Bean の寿命を定義するのに役立つことです。

デフォルトでは、Bean スコープはシングルトンです。 Bean に @singleton のアノテーションを付けると、最初に 1 回作成され、最後に破棄されますが、StepScope は特定のステップに固有であり、シングルトンではありません。

コンポーネントを StepScope として指定することにより、Spring コンテナーは各ステップの新しいインスタンスを開始します。 ステップ スコープ Bean の寿命は、ステップの寿命に依存します。

ステップ スコープの Bean では、Bean は各ステップの最初に作成され、最後に破棄されます。 アノテーションは@StepScopeです。

StepScope を使用するもう 1つの理由は、Bean の状態を分離するため、ステップが並行して実行される場合です。 これにより、各ステップの各スレッドはインスタンスを持ち、他のスレッドによって管理されている状態を変更しません。

そうでない場合、複数のスレッドが Bean の状態を変更し、一貫性がなくなります。 また、StepScope を介して、パラメーターのレイト バインディングを実行しながら、stepExecutionContextstepExecutionListener を介してステップ間で情報を渡すことができます。

したがって、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 の 公式ドキュメント を参照してください。