我想创建一个通用StepExecutionListener
。它应记录由Tasklet
步骤处理的项目计数。
问题:计数不会自动更新。所以我可能必须在Tasklet.execute()
的某个地方这样做。但是如何?
@Bean
@JobScope
public Tasklet myTasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
int count = dao.deleteByName(name);
//TODO how to set the count into the stepExecution context?
return RepeatStatus.FINISHED;
}
};
}
@Bean
public Step myStep() {
return getStepBuilderFactory().get("myStep")
.listener(new StepListener())
.tasklet(myTasklet())
.build();
}
public class StepListener extends StepExecutionListenerSupport {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
long items = stepExecution.getWriteCount();
logger.info("items processed in tasklet: " + items);
return super.afterStep(stepExecution);
}
}
答案 0 :(得分:1)
contribution.incrementWriteCount()
可能是要走的路
@Bean
@JobScope
public Tasklet myTasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
int count = dao.deleteByName(name);
contribution.incrementWriteCount(count); // <--
return RepeatStatus.FINISHED;
}
};
}
答案 1 :(得分:0)
您可以使用StepExecution
从execute()
获取stepExecution = chunkContext.getStepContext().getStepExecution()
。你应该在你的Tasklet中设置stepExecutionContext,以防止在每次执行时都使用get方法(这可能代价很高,因为我不认为这些是简单的getter)。
现在,您可以使用stepExecution
来操纵execute()
中的stepExecution.setLong("yourWriteCount", count)
个内部变量,并获取相同内容。 (如果它是自定义的tasklet并不重要,则适用相同的规则)。
在监听器中,您可以使用executionContext参数获取yourWriteCount
,方法相同。
通常executionContext
在整个步骤中都是相同的。