ファイルの名前を取得する残りの呼び出しに基づいてファイルを処理する必要があるという要件があり、それをジョブパラメーターに追加し、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;
}
スプリングバッチStepScope
オブジェクトは、シングルトンではなく、特定のステップに固有のものです。ご存じのとおり、SpringのデフォルトのBeanスコープはシングルトンです。ただし、StepScope
であるスプリングバッチコンポーネントを指定すると、Spring Batchはスプリングコンテナを使用して、各ステップの実行に対してそのコンポーネントの新しいインスタンスをインスタンス化します。
これは、パラメータがStepContext
またはJobExecutionContext
レベルのいずれかで指定され、プレースホルダの代わりに使用する必要があるパラメータレイトバインディングを行う場合に便利です。 。
StepScope
を使用するもう1つの有用な理由は、同じコンポーネントを並列ステップで再利用することにしたときです。コンポーネントが内部状態を管理する場合、1つのスレッドが別のスレッドによって管理される状態を損なわないようにStepScope
ベースであることが重要です(たとえば、特定のステップの各スレッドはStepScope
コンポーネント)。