web-dev-qa-db-ja.com

Spring Batch Step Scopeの仕組み

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

私は(リーダー、ライター)のステップスコープBeanを作成し、ジョブパラメータを使用しています。非同期タスクエクセキューターを使用してジョブを起動しているときに新しいスレッドでジョブを開始していますが、私の質問は春までにBeanを作成する方法です@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;
}
16
lakshmi kanth

スプリングバッチStepScopeオブジェクトは、シングルトンではなく、特定のステップに固有のものです。ご存じのとおり、SpringのデフォルトのBeanスコープはシングルトンです。ただし、StepScopeであるスプリングバッチコンポーネントを指定すると、Spring Batchはスプリングコンテナを使用して、各ステップの実行に対してそのコンポーネントの新しいインスタンスをインスタンス化します。

これは、パラメータがStepContextまたはJobExecutionContextレベルのいずれかで指定され、プレースホルダの代わりに使用する必要があるパラメータレイトバインディングを行う場合に便利です。 。

StepScopeを使用するもう1つの有用な理由は、同じコンポーネントを並列ステップで再利用することにしたときです。コンポーネントが内部状態を管理する場合、1つのスレッドが別のスレッドによって管理される状態を損なわないようにStepScopeベースであることが重要です(たとえば、特定のステップの各スレッドはStepScopeコンポーネント)。

38
Naros