Spring Batch - 计算已处理的行数

时间:2013-09-11 14:09:55

标签: spring count rows spring-batch

所以我正在创建一个Spring Batch作业来读取CSV文件以及包含不完整数据的某些行;它检查,输出到行不完整的日志,并跳过。它工作得很好,除了在工作结束时我希望它记录它找到的不完整的行数。只是一些简单的事情,比如“X不完整的行被发现”。

我用谷歌搜索并寻找解决方案,但没有发现任何真的。

感谢任何帮助,只需要询问更多信息。

3 个答案:

答案 0 :(得分:10)

Spring Batch本身会跟踪它读取,写入,处理的次数以及跳过的次数(对于每个这些数字)。该信息存储在StepExecution中。可以从StepExecutionListener访问StepExecution。在这种情况下,afterStep方法的实现就足够了。

public class SkippedItemStepExecutionListener extends StepExecutionListenerSupport {

    @Override
    public ExitStatus afterStep(StepExecution stepExecution) {
        int skipped = stepExecution.getSkipCount(); // Total for read+write+process
        // Log it to somewhere.        
        return null;
    }
}

the reference guide

中介绍了如何将其添加到作业/步骤中

链接

  1. StepExecution javadoc
  2. StepExecutionListener javadoc
  3. 监听器配置Reference

答案 1 :(得分:7)

管理解决这个问题,我的方法如下:

在ItemProcessor中,我添加了一个属性和一个方法,用于从流程方法中访问ExecutionContext,

private ExecutionContext executionContext;

@BeforeStep
public void beforeStep(StepExecution stepExecution)
{
    this.executionContext = stepExecution.getExecutionContext();
}

...然后在process()方法中找到我要记录的其中一行时,我可以这样做,

this.executionContext.putInt( "i_ThoseRows", this.executionContext.getInt( "i_ThoseRows", 0 ) + 1 );

最后,我向ItemProcessor添加了另一个方法,以便在步骤结束时打印结果,

@AfterStep
public void afterStep(StepExecution stepExecution)
{
    System.out.println( "Number of 'Those rows': " + this.executionContext.getInt( "i_ThoseRows", 0 ) );
}

希望它有助于某人

答案 2 :(得分:0)

补充@dogfight回答:

来自春季批处理文档:

  

注释由XML解析器分析   元素,所以你需要做的就是使用XML命名空间进行注册   听众有一步

因此,要在调用onStep()和afterStep()之前调用监听器回调注释函数,需要在步骤中将ItemProcessor注册为侦听器:

<listeners>
    <listener ref="MyItemProcessor">
</listeners>

否则,在使用NullPointerException时,您将获得executionContext