所以我正在创建一个Spring Batch作业来读取CSV文件以及包含不完整数据的某些行;它检查,输出到行不完整的日志,并跳过。它工作得很好,除了在工作结束时我希望它记录它找到的不完整的行数。只是一些简单的事情,比如“X不完整的行被发现”。
我用谷歌搜索并寻找解决方案,但没有发现任何真的。
感谢任何帮助,只需要询问更多信息。
答案 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;
}
}
中介绍了如何将其添加到作业/步骤中
链接
答案 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
。