我正在使用 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();
}
您没有定义“已处理记录”的含义(即是否包含过滤记录,是否包含跳过记录等),但可以使用
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);
}
}