我使用的是Spring Batch,我创建了一个使用SimpleAsyncTaskExecutor
运行的tasklet。在此步骤中,我正在使用
StepExecutionContext
@BeforeStep
public void saveStepExecution(StepExecution stepExecution) {
this.stepExecution = stepExecution;
}
在tasklet的处理方法中,我尝试更新上下文:
stepExecution.getExecutionContext().put("info", contextInfo);
这导致ConcurrentModificationException
上的stepExecution
s。
如何避免这些并在此多线程环境中更新我的上下文?
答案 0 :(得分:0)
步骤执行上下文是共享资源。你真的想在每个帖子中放一个“信息”吗?根据您的上下文,有很多方法可以解决这个问题,因为它是一个线程问题,而不是Spring批处理。
1)如果每个线程有一个信息,让线程在上下文中放置一个threadlocal(一次),然后使用threadlocal存储“info”。
2)如果上下文信息是“全局”的,那么你应该在同步块中执行put并在放入之前检查它是否存在。
希望这有帮助。