2011-06-30 63 views
0

我正在使用Spring Batch,并创建了一个使用SimpleAsyncTaskExecutor运行的tasklet。在这一步,我检索StepExecutionContext在Spring批处理中的多线程步骤中写入StepExecutionContext

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

在微进程的处理方法,我尝试更新的背景:

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

这导致ConcurrentModificationException S于该stepExecution。 如何避免这些并在此多线程环境中更新我的上下文?

+0

请提供更多信息,例如其中spring批处理版本和tasklet实现的来源 –

+0

SpringBatch 2.1.8。你需要回答这个问题需要哪些细节? – tobiasbayer

+0

如果您使用'org.springframework.batch.core.step.tasklet.Tasklet'实现了一个tasklet,那么您需要实现'RepeatStatus execute(StepContribution贡献,ChunkContext chunkContext)'并且chunkContext里面是一个可修改的stepExecutionContext,您可以使用BeforeStep注解获得stepExecution,所以我不确定你的“tasklet”是什么样子,或者它甚至是“Tasklet” –

回答

0

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

1)如果每个线程有一个信息,让线程在上下文中放置一个threadlocal(一次),然后使用threadlocal存储“info”。 2)如果上下文信息是“全局”,那么你应该把它放在一个同步块中,并在放置之前检查它的存在。

希望这会有所帮助。

相关问题