我读了一些关于此的文章,但我不确定我的案子。
我正在使用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批处理参考中,我们可以看到其中一种用法是“并发批处理:作业的并行处理”
正如评论中已经回答的那样,作业实例具有自己的作业执行,具有自己的上下文,因此,如果您当然遵循设计,则弹簧批处理设计假定执行上下文具有线程安全性。
这里是Spring批处理参考指南的链接,实际上并没有那么大