8

所以我正在创建一个 Spring Batch 作业来读取 CSV 文件和某些包含不完整数据的行;它检查,输出该行不完整的日志,然后跳过。它工作得很好,除了在工作结束时我希望它记录它发现的不完整行数。就像“发现 X 个不完整的行”这样简单的事情。

我用谷歌搜索并四处寻找解决方案,但没有真正找到任何东西。

任何帮助表示赞赏,如果需要更多信息,请询问。

4

3 回答 3

11

Spring Batch 本身会跟踪它读取、写入、处理的记录数以及跳过的记录数(对于每个数字)。该信息存储在StepExecution. StepExecution可以从StepExecutionListener. 在这种情况下,该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;
    }
}

参考指南中解释了如何将其添加到您的工作/步骤中

链接

  1. 步骤执行javadoc
  2. StepExecutionListener javadoc
  3. 监听器配置参考
于 2013-09-11T14:45:08.797 回答
9

设法解决这个问题,我是这样做的:

在 ItemProcessor 中,我添加了一个属性和一个方法,用于从 process 方法中访问 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 ) );
}

希望它可以帮助某人

于 2013-09-12T08:37:21.607 回答
0

为了补充@dogfight的答案:

来自春季批处理文档:

注释由 XML 解析器分析元素,因此您需要做的就是使用 XML 命名空间通过一个步骤注册侦听器

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

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

否则你会NullPointerException在使用executionContext.

于 2015-10-28T16:40:15.683 回答