1. ホーム
  2. spring

[解決済み] Spring Batchのステップスコープの仕組み

2022-02-07 10:02:44

質問事項

私は、ファイル名を取得する残りの呼び出しに基づいてファイルを処理する必要がある要件を持っています。私はそれをジョブ・パラメータに追加し、ビーンの作成中にそれを使用しています。

私は(reader,writer)のステップスコープビーンを作成し、ジョブパラメータを使用しています。私はジョブを起動するために非同期タスクエクスキュータを使用しているので、新しいスレッドでジョブを開始しています。 @StepScope

jobParametersBuilder.addString("fileName", request.getFileName());
jobExecution = jobLauncher.run(job, jobParametersBuilder.toJobParameters());
@Bean
public JobLauncher jobLauncher() {
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository());
    jobLauncher.setTaskExecutor(asyncTaskExecutor());
    return jobLauncher;
}

@Bean
@StepScope
public ItemWriter<Object> writer(@Value ("#{jobParameters['fileName']}"String    fileName) {
    JdbcBatchItemWriter<Object> writer = new JdbcBatchItemWriter<>();
    writer.setItemSqlParameterSourceProvider(
        new BeanPropertyItemSqlParameterSourceProvider<Object>());
    writer.setSql(queryCollection.getquery());
    writer.setDataSource(dataSource(fileName));
    return writer;
}

解決方法は?

スプリングバッチ StepScope オブジェクトは、特定のステップに固有のものであり、シングルトンではありません。 ご存知の方も多いと思いますが、SpringのデフォルトのBeanスコープはシングルトンになります。 しかし、Springのバッチコンポーネントを指定することで StepScope は、Spring Batchがステップ実行ごとにそのコンポーネントの新しいインスタンスをインスタンス化するために、スプリングコンテナを使用することを意味します。

これは、パラメータのレイトバインディングを行う際に便利です。 StepContext または JobExecutionContext レベルであるため、ファイル名に関する例のようにプレースホルダーに置き換える必要があります。

を使用するもう一つの便利な理由は StepScope は、同じコンポーネントを並列のステップで再利用する場合です。 もしそのコンポーネントが何らかの内部状態を管理するのであれば、その状態は StepScope をベースにして、あるスレッドが他のスレッドの管理する状態を損なわないようにします(たとえば、あるステップの各スレッドが StepScope コンポーネント)。