如何更新spring-batch Tasklet中的项目数?

时间:2016-10-06 08:25:08

标签: java spring spring-batch

我想创建一个通用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);
    }
}

2 个答案:

答案 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)

您可以使用StepExecutionexecute()获取stepExecution = chunkContext.getStepContext().getStepExecution()。你应该在你的Tasklet中设置stepExecutionContext,以防止在每次执行时都使用get方法(这可能代价很高,因为我不认为这些是简单的getter)。

现在,您可以使用stepExecution来操纵execute()中的stepExecution.setLong("yourWriteCount", count)个内部变量,并获取相同内容。 (如果它是自定义的tasklet并不重要,则适用相同的规则)。

在监听器中,您可以使用executionContext参数获取yourWriteCount,方法相同。

通常executionContext在整个步骤中都是相同的。