【问题标题】:Writing to the StepExecutionContext in multi-threaded steps in Spring Batch在 Spring Batch 的多线程步骤中写入 StepExecutionContext
【发布时间】:2011-06-30 11:40:00
【问题描述】:

我正在使用 Spring Batch,并且我创建了一个使用 SimpleAsyncTaskExecutor 运行的 tasklet。在这一步中,我使用

检索StepExecutionContext
@BeforeStep
public void saveStepExecution(StepExecution stepExecution) {
    this.stepExecution = stepExecution;
}

在tasklet的处理方法中,我尝试更新上下文:

stepExecution.getExecutionContext().put("info", contextInfo);

这会导致stepExecution 上的ConcurrentModificationExceptions。 在这个多线程环境中如何避免这些并更新我的上下文?

【问题讨论】:

  • 请提供更多信息,例如哪个spring批处理版本和tasklet实现的来源
  • SpringBatch 2.1.8。回答问题需要哪些实现细节?
  • 如果你用'org.springframework.batch.core.step.tasklet.Tasklet'实现了一个tasklet,你需要实现'RepeatStatus execute(StepContribution贡献,ChunkContext chunkContext)'并且在chunkContext里面是一个可修改的 stepExecutionContext,你使用 BeforeStep Annotation 来获取 stepExecution,所以我不确定你的“tasklet”是什么样的,或者它是否是一个“Tasklet”

标签: multithreading spring spring-batch


【解决方案1】:

步骤执行上下文是共享资源。您是否真的想在每个线程中放置一个“信息”?根据您的上下文,有很多方法可以解决这个问题,因为这是一个线程问题,而不是 Spring 批处理。

1) 如果每个线程有一个信息,让线程在上下文中放置一个线程本地(一次),然后使用线程本地存储“信息”。

2) 如果上下文信息是“全局”的,那么您应该在同步块中执行 put 并在 put 之前检查其是否存在。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 2017-12-29
    • 2020-01-25
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多