我有一个Tasklet
,想要计算已处理的项目。然后,常见的StepExecutionListener
应该能够在afterStep()
中读取这些已处理的项目数:
@Bean
public Step myStep() {
return stepBuilderFactory.get("Step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
int items = dao.deleteItems(); //how to pass these items to a StepExecutionListener?
return RepeatStatus.FINISHED;
}
})
.build();
@Component
public class MyListener extends StepExecutionListenerSupport {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
long items = stepExecution.getWriteCount();
return super.afterStep(stepExecution);
}
}
如何将已处理的项目放入tasklet中的stepExecution
?
答案 0 :(得分:3)
有两种方法可以做到:
StepContribution
contribution.incrementWriteCount(items);
的写入次数
StepExecution
设置写入次数。您可以从当前StepExecution
访问ChunkContext
。您需要致电getStepContext()
以检索StepContext
,然后致电getStepExecution()
以检索StepExecution
,最后,您可以使用setWriteCount(writeCount)
设置写入次数。< / LI>
示例代码为:
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
int items = dao.deleteItems();
contribution.incrementWriteCount(items);
// OR: chunkContext.getStepContext().getStepExecution().setWriteCount(items);
return RepeatStatus.FINISHED;
}
答案 1 :(得分:0)
当您使用的是tasklet而不是chunk时,经典的“read / process / write”不适用。如果要在步骤执行中将值传递到同一步骤中的stepExecutionListener ,则只需在stepExecutionContext中输入一个键/值:
int items=dao.deleteItems();
chunkContext.getStepContext().getStepExecution().getExecutionContext().putInt("MYKEY", items);
在StepExecutionListener afterStep(StepExecution stepExecution)方法中:
ExecutionContext executionContext = stepExecution.getExecutionContext();
int items = executionContext.getInt("MYKEY");