如何计算ItemReader中的stepReads以使中间结果可用,即使步骤仍在运行?

时间:2016-01-11 20:51:41

标签: java spring spring-batch

我的XML步骤声明

<step id="MongoDbLoadDataStep" next="checkStatusStep">
    <tasklet>
        <chunk reader="MongoReader" writer="MongoWriter" commit-interval="5"/>
    </tasklet>
</step>

一个阅读器只有一个方法read,没有机会增加读取计数器或访问Spring StepContribution实例。所以我需要找到一种方法,如何提供一种机制,可以让我增加步读计数器。在Tasklet我们有非常方便的方法:

RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)

但是在XML中只有默认的Tasklet由Spring内部管理。任何想法我该怎么做?

PS

我无法修改XML批处理配置

1 个答案:

答案 0 :(得分:2)

每次读取后,您都可以实现ItemReadListener来递增计数器。还有一个StepExecutionListener将结果存储在上下文中(省略了空方法):

public class ItemReadCountListener implements ItemReadListener<T>, StepExecutionListener {

    private Integer count = 0;

    @Override
    public void afterRead(T item) {
        count++; // Increment counter
    }

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
       stepExecution.getJobExecution().getExecutionContext().put("ITEM_READ_COUNT", count); // Store counter
    }
}

将其添加到您的块中:

<batch:chunk>
    <batch:listeners merge="true">
         <batch:listener>
              <bean class="xx.xx.xx.ItemReadCountListener" />
         </batch:listener>
    </batch:listeners>
</batch:chunk>