首页 文章

Spring Batch步骤范围如何工作

提问于
浏览
11

我有一个要求,我需要根据其中我得到文件名的其余调用来处理文件,我将它添加到job参数并在创建bean时使用它 .

我正在为(读者,作家)和使用job参数创建步骤范围Bean . 我正在一个新线程中开始工作,因为我使用异步任务exceutor来启动工作,我的问题是如何通过spring创建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;
}

1 回答

  • 29

    spring 批 StepScope 对象是特定步骤唯一的而不是单例 . 您可能知道,Spring中的默认bean范围是单例 . 但是通过指定 spring 批处理组件 StepScope 意味着Spring Batch将使用spring容器为每个步骤执行实例化该组件的新实例 .

    这对于执行参数后期绑定通常很有用,其中参数可以在 StepContextJobExecutionContext 级别指定,并且需要替换占位符,就像具有文件名要求的示例一样 .

    使用 StepScope 的另一个有用的原因是当您决定在并行步骤中重用相同的组件时 . 如果组件管理任何内部状态,则重要的是它基于 StepScope ,以便一个线程不会损害由另一个线程管理的状态(例如,给定步骤的每个线程都有自己的 StepScope 组件的实例) .

相关问题