Spring Batch のステップ スコープ
このチュートリアルでは、Spring Batch での Step Scope の動作について説明します。 Spring Batch には、アプリケーション、バッチ コア、バッチ インフラストラクチャの 3つの主要な高レベル コンポーネントがあります。
Spring バッチのジョブとステップ
ジョブは、バッチ処理全体をカプセル化するエンティティです。 つまり、ジョブ階層の最上位にあります。 すべてのジョブには、1つ以上のステップが含まれます。
これは、各ステップに 1つの ItemReader
、ItemProcessor
、および ItemWriter
があるステップ インスタンスのコンテナーです。 ジョブに含まれる概念には、JobInstance
、JobParameters
、および JobExecution
があります。
ステップは、バッチ プロセスを定義および制御するために必要なすべての情報を含む、バッチ ジョブの独立したドメイン オブジェクトです。 Job と同様に、Step には、Job のように JobExecution
と相関する StepExecution
があります。
Spring は StepScope
と JobScope
という 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
を介して、パラメーターのレイト バインディングを実行しながら、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 の 公式ドキュメント を参照してください。