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