Spring 批处理步骤范围如何工作
How Does Spring Batch Step Scope Work
我有一个要求,我需要根据我获取文件名的 rest 调用来处理文件,我将它添加到作业参数并在创建 bean 时使用它。
我正在为 (reader,writer) 创建 step scope Beans 并使用作业 parameter.I 我在新线程中开始作业,因为我正在使用异步任务执行器来启动作业,并且我的问题是当我们定义 @StepScope
时 spring 将如何创建 bean
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;
}
spring 批处理 StepScope
对象是特定步骤唯一的对象,而不是单例对象。您可能知道,Spring 中的默认 bean 作用域是单例。但是通过将 spring 批处理组件指定为 StepScope
意味着 Spring Batch 将使用 spring 容器为每个步骤执行实例化该组件的新实例。
这对于执行参数后期绑定通常很有用,其中可以在 StepContext
或 JobExecutionContext
级别指定参数并且需要用占位符替换,就像您的示例一样文件名要求。
使用 StepScope
的另一个有用原因是当您决定在并行步骤中重用同一组件时。如果组件管理任何内部状态,重要的是它是基于 StepScope
的,这样一个线程就不会损害另一个线程管理的状态(例如,给定步骤的每个线程都有自己的 StepScope
组件).
我有一个要求,我需要根据我获取文件名的 rest 调用来处理文件,我将它添加到作业参数并在创建 bean 时使用它。
我正在为 (reader,writer) 创建 step scope Beans 并使用作业 parameter.I 我在新线程中开始作业,因为我正在使用异步任务执行器来启动作业,并且我的问题是当我们定义 @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;
}
spring 批处理 StepScope
对象是特定步骤唯一的对象,而不是单例对象。您可能知道,Spring 中的默认 bean 作用域是单例。但是通过将 spring 批处理组件指定为 StepScope
意味着 Spring Batch 将使用 spring 容器为每个步骤执行实例化该组件的新实例。
这对于执行参数后期绑定通常很有用,其中可以在 StepContext
或 JobExecutionContext
级别指定参数并且需要用占位符替换,就像您的示例一样文件名要求。
使用 StepScope
的另一个有用原因是当您决定在并行步骤中重用同一组件时。如果组件管理任何内部状态,重要的是它是基于 StepScope
的,这样一个线程就不会损害另一个线程管理的状态(例如,给定步骤的每个线程都有自己的 StepScope
组件).