我会继续回答我自己的问题。有多种方法可以做到这一点,但我发现先将属性和对象保存到StepExecutionContext,然后在步骤完成后将它们提升到JobExecutionContext 效果很好。它也被记录得很彻底here.
第 1 步:
在您的 Writer / Reader 中声明一个私有 StepExecution。然后,在您的读/写方法中创建步骤上下文,并将您的数据作为键/值对放入:
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("someKey", someObject);
第 2 步:
将ExecutionContextPromotionListener 添加到步骤的 bean 配置中。 ExecutionContextPromotionListener 必须包含一个名为 Keys 的 String[] 属性,其中包含您希望提升到超出您的步骤的 Job 范围的键,类似于 LinkedIn article 中的此实现:
@Bean
public ExecutionContextPromotionListener promotionListener() {
ExecutionContextPromotionListener listener = new ExecutionContextPromotionListener();
listener.setKeys( new String[] { "entityRef" } );
return listener;
}
第 3 步:
您还需要在步骤执行之前将 StepExecution 添加到您的 Writer 中:
@BeforeStep
public void saveStepExecution( StepExecution stepExecution ) {
this.stepExecution = stepExecution;
}
第 4 步:
这将使您的write() 方法可以访问stepExecution 实例,它可以在其中访问stepContext 以便您保存数据。例如,你可以写
write() {
... // write logic
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("keyYouWantToPutIn", theCorrespondingDataObject);
}
最后,在下一步中,您可以检索此数据(示例直接来自Spring Batch documentation:
@BeforeStep
public void retrieveInterstepData(StepExecution stepExecution) {
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
this.someObject = jobContext.get("someKey");
}
不过,这一次请注意,它是从 jobContext 而非 stepContext 访问的——它已被提升!