所以我正在创建一个 Spring Batch 作业来读取 CSV 文件和某些包含不完整数据的行;它检查,输出该行不完整的日志,然后跳过。它工作得很好,除了在工作结束时我希望它记录它发现的不完整行数。就像“发现 X 个不完整的行”这样简单的事情。
我用谷歌搜索并四处寻找解决方案,但没有真正找到任何东西。
任何帮助表示赞赏,如果需要更多信息,请询问。
所以我正在创建一个 Spring Batch 作业来读取 CSV 文件和某些包含不完整数据的行;它检查,输出该行不完整的日志,然后跳过。它工作得很好,除了在工作结束时我希望它记录它发现的不完整行数。就像“发现 X 个不完整的行”这样简单的事情。
我用谷歌搜索并四处寻找解决方案,但没有真正找到任何东西。
任何帮助表示赞赏,如果需要更多信息,请询问。
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;
}
}
参考指南中解释了如何将其添加到您的工作/步骤中
链接
设法解决这个问题,我是这样做的:
在 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 ) );
}
希望它可以帮助某人
为了补充@dogfight的答案:
来自春季批处理文档:
注释由 XML 解析器分析元素,因此您需要做的就是使用 XML 命名空间通过一个步骤注册侦听器
因此,要调用监听器回调注释函数 beforeStep() 和 afterStep() 您需要在步骤中将 ItemProcessor 注册为监听器:
<listeners>
<listener ref="MyItemProcessor">
</listeners>
否则你会NullPointerException
在使用executionContext
.