2016-08-05 84 views
4

我有一個需求,我需要根據剩餘的處理文件來處理文件,我在其中獲取文件的名稱,我將它添加到作業參數並在創建bean時使用它。Spring批處理步驟作用域如何工作

我正在創建步驟作用域Bean(讀者,作家)和使用作業參數。我在新線程中啓動作業,因爲我使用異步任務exceutor來啓動作業,我的問題是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; 
} 

回答

15

彈簧批次StepScope對象是一個是唯一的一個特定的步驟,而不是一個單由彈簧來創建。正如你可能知道的那樣,Spring中的默認bean作用域是一個單例。但通過指定一個彈簧批處理組件爲StepScope意味着Spring Batch將使用彈簧容器爲每個步驟執行實例化該組件的新實例。

這對於參數後期綁定通常很有用,其中可以在StepContextJobExecutionContext級別指定參數,並且需要替代佔位符,這很像您的文件名要求示例。

使用StepScope的另一個有用的理由是當您決定在並行步驟中重複使用相同的組件時。如果組件管理任何內部狀態,則重要的是它基於StepScope,以便一個線程不會損害另一個線程管理的狀態(例如,給定步驟的每個線程都有其自己的StepScope組件實例)。

相關問題