如何计算 ItemReader 中的 stepReads 以使中间结果可用,即使 step 仍然是 运行?

How to count stepReads in ItemReader to make intermediate result available even if step is still running?

我的XML步骤声明

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

A reader 只有一种方法 read 并且没有机会增加读取计数器或访问 Spring StepContribution 实例。所以我需要找到一种方法来提供一种机制,使我能够增加步进读数计数器。在Tasklet中我们有非常方便的方法:

RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext)

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

PS

无法修改XML批量配置

您可以实现 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>