2016-08-05 5 views
4

ファイルの名前を取得する残りの呼び出しに基づいてファイルを処理する必要がある場合、ジョブパラメータに追加してBeanの作成中に使用するという要件があります。Springバッチステップスコープの動作方法

(リーダー、ライター)のためのステップスコープBeanを作成し、ジョブパラメータを使用しています。新しいスレッドでジョブを開始しています。私はasynchronusタスクエクセプターを使用してジョブを開始しています。我々は、スプリングバッチStepScopeオブジェクトは、特定のステップではなくシングルトンに固有のものである@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; 
} 

答えて

15

を定義するときにバネによって作成されます。ご存じのように、SpringのデフォルトのBeanスコープはシングルトンです。しかし、バッチ・バッチ・コンポーネントをStepScopeと指定すると、バネ・バッチはバネ・コンテナを使用して、各ステップ実行のためにそのコンポーネントの新しいインスタンスをインスタンス化します。

これはパラメータがStepContextまたはJobExecutionContextのレベルで指定され、ファイル名要件の例のように、プレースホルダの代わりに使用する必要があるパラメータのレイトバインドに便利です。

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

関連する問題