Spring Batch上的ExecutionContext和线程安全

问题描述 投票:0回答:1

我读了一些关于此的文章,但我不确定我的案子。

我正在使用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);
    }

现在,我可以在处理器步骤中成功看到该参数。

但是,如果我并行执行整个作业,并且对不同的作业使用不同的值怎么办?任何并发的副作用吗?

谢谢。射线。

java spring concurrency spring-batch spring-batch-admin
1个回答
0
投票

从spring批处理参考中,我们可以看到其中一种用法是“并发批处理:作业的并行处理”

正如评论中已经回答的那样,作业实例具有自己的作业执行,具有自己的上下文,因此,如果您当然遵循设计,则弹簧批处理设计假定执行上下文具有线程安全性。

这里是Spring批处理参考指南的链接,实际上并没有那么大

https://docs.spring.io/spring-batch/trunk/reference/html/spring-batch-intro.html#springBatchUsageScenarios

© www.soinside.com 2019 - 2024. All rights reserved.