Spring Batch 中所有 chunk 中处理的记录总数

问题描述 投票:0回答:1

我正在使用 Spring Batch 从关系数据库中读取记录,并使用 Chunk 写入无 SQL 数据库。我想记录作业完成后处理的记录总数。 我找不到任何相关的听众可以帮助我完成任务。有基于项目和基于步骤的侦听器,但没有任何信息可以给我处理记录的总数。任何帮助将不胜感激。

  @Bean
    public Step step1(JobRepository jobRepository,
                      PlatformTransactionManager transactionManager) {
        return new StepBuilder("Stepname", jobRepository)
                .allowStartIfComplete(true)
                .<OriginEntity, DestinationEntity>chunk(chunkSize, transactionManager)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .faultTolerant()
                .skip(ProcessorException.class)
                .skip(WriterException.class)
                .skipLimit(skipLimit)
                .listener(itemReaderExecutionListener)
                .listener(itemProcessorExecutionListener)
                .listener(itemWriterExecutionListener)
                .build();
    }
spring-batch
1个回答
0
投票

您没有定义“已处理记录”的含义(即是否包含过滤记录,是否包含跳过记录等),但可以使用

StepExecution
中Spring Batch提供的计数器来计算总数(
writeCount
processSkipCount
filterCount
等)。例如,如果您想在处理阶段包含跳过和过滤的项目,则总数将为:

processedCount = writeCount + processSkipCount + filterCount;

writeCount
表示正确处理的项目数(即传递给编写者并正确编写)。

否则,您可以编写一个自定义的

ItemProcessListener
来进行计算,这是一个简单的示例:

class ItemCountingListener<I, O> implements ItemProcessListener<I, O>, StepExecutionListener {
    
    private long processCount;
    private long filterCount;
    private long errorCount;

    private StepExecution stepExecution;

    @Override
    public void beforeStep(StepExecution stepExecution) {
        this.stepExecution = stepExecution;
    }

    @Override
    public void afterProcess(I item, O result) {
        if (result == null) {
            filterCount++;
            stepExecution.getExecutionContext().put("filter.count", filterCount);
        } else {
            processCount++;
            stepExecution.getExecutionContext().put("process.count", processCount);
        }

    }

    @Override
    public void onProcessError(I item, Exception e) {
        errorCount++;
        stepExecution.getExecutionContext().put("error.count", errorCount);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.