[英]How to update item count in spring-batch Tasklet?
我想創建一個通用的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);
}
}
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;
}
};
}
你可以得到StepExecution
從您execute()
與stepExecution = chunkContext.getStepContext().getStepExecution()
您應該在Tasklet中設置stepExecutionContext,以防止在每次執行時都使用get方法(這可能代價很高,因為我認為這些並不是簡單的getter)。
現在,您可以在stepExecution
execute()
使用stepExecution.setLong("yourWriteCount", count)
來操縱stepExecution
的內部變量,並對其進行相同操作。 (這是否是自定義tasklet都沒有關系,適用相同的規則)。
在偵聽器中,可以以相同的方式通過executionContext參數獲取yourWriteCount
。
通常,整個過程中的executionContext
是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.