【问题标题】:ExecutionContext and Thread safety on Spring BatchSpring Batch 上的 ExecutionContext 和线程安全
【发布时间】: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


【解决方案1】:

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

正如在 cmets 中已经回答的那样,作业实例有它自己的作业执行,它有它自己的上下文,所以如果你当然遵循设计,spring 批处理设计是假设执行上下文的线程安全。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多