【发布时间】:2015-03-18 10:54:49
【问题描述】:
我读过几篇关于此的文章,但我不确定我的情况。
我正在使用 ExecutionContext 将参数从 Tasklet 传递到 Step
我想确保如果我使用相同的步骤并行执行相同的作业实例,我不会产生并发副作用。
这是我的工作:
@Bean
public Job processFileJob() throws Exception {
return this.jobs.get("processFileJob").start(downloadFileStep()).next(processSnidFileStep()).build();
}
public Step downloadFileStep() {
return this.steps.get("downloadFileTaskletStep").tasklet(downloadFileTasklet()).listener(executionContextPromotionListener()).build();
}
我通过这种方式将参数从 downloadFileStep 传递给 processSnidFileStep:
public class DownloadFileTasklet implements Tasklet, StepExecutionListener {
..
private void downloadFileFromExtractTool(ChunkContext chunkContext,
..
stepContext.put("totalRecords", totalRecords);
..
}
并以这种方式将参数检索到我的步骤中:
@Bean
@Scope(value = "step", proxyMode = ScopedProxyMode.INTERFACES)
public ItemProcessor<MyDTO, MyDTO> processor(@Value("#{jobExecutionContext[totalRecords]}") int totalRecords
) {
return new PushItemProcessor(totalRecords);
}
现在我可以在处理器步骤中成功看到该参数。
但是,如果我并行执行整个作业并为不同的作业设置不同的值怎么办?有没有并发的副作用?
谢谢。 射线。
【问题讨论】:
-
您所说的“并行执行整个作业”是什么意思?在 Spring Batch 中,每个作业实例都有自己的 JobExecution,因此启动 n 个作业实例应该没有副作用
-
抱歉不清楚。我的意思是如果我并行执行同一个作业的多个实例..
-
@rayman 我有一个类似的用例,即同一作业的多个实例正在运行。但我的 executionContext 变得混合或可用于同一作业的所有实例。你能找到解决方案吗?谢谢。
标签: java spring concurrency spring-batch spring-batch-admin