FlatFileParseException.getLineNumber()给出错误记录的错误行号

时间:2016-09-14 20:32:25

标签: spring-batch

我已设置弹出批处理作业以从 .csv文件中读取并将整个数据转储到DB中。由于.csv是一个平面文件,显而易见的选择是框架自己的平面文件阅读器org.springframework.batch.item.file.FlatFileItemReader

我还编写了一个侦听器,它在读取文件时侦听任何错误,并获取错误输入以及解析期间发生异常的行号。

以下是侦听器的代码 -

@Override
public void onReadError(Exception e){

if (e instanceof FlatFileParseException){

FlatFileParseException ffpe = (FlatFileParseException)e;
errorMessage.append("Could not process line number --"+ffpe.getLineNumber());
errorMessager.append("Faulty Input --"+ffpe.getInput());
logger.error(errorMessage.toString());
}

这是我的批处理作业配置---

<batch:job id="myjob">
 <batch:step id="validateFile" next="nextStep">
  <batch:tasklet ref="validateFileTasklet" />
 </batch:step>

 <batch:step id="nextStep">
  <batch:tasklet task-executor="taskExecutor" throttle-limit="5">
   <batch:chunk reader="itemReader" writer="mysqlItemWriter" commit-interval="5" skip-limit="5">
    <batch:skippable-exception-classes>
     <batch:include   class="org.springframework.batch.item.file.FlatFileParseException" />
     </batch:skippable-exception-classes>
    <batch:listeners>
      <batch:listener>
        <bean class="org.organizationname.productname.batch.listener.FlatFileParseExceptionListener" />
      </batch:listener>
    </batch:listeners>
  </batch:chunk>
 </batch:tasklet>
 </batch:job>

验证器,阅读器和编写器都已定义良好且工作正常。

TaskExecutorSimpleAsyncTaskExecutor

然后我篡改我的示例.csv文件以部分删除记录中的值以产生异常。正如预期的那样,会发生异常。监听器触发,但它给出错误的行号。虽然它每次都给出正确的错误输入。

如果重复运行,行号也会有所不同。例如,我篡改了我的.csv示例文件的第3行和第11行,但是监听器给了我第6行和第12行作为发生异常的记录。对于相同的篡改记录,它有时给我5号线和11号线。

关于为什么会发生这种情况的任何想法?

1 个答案:

答案 0 :(得分:0)

如果不同步作家,则无法进行并行阅读。当第一个线程创建linecounter时,另一个线程很可能(尽管几乎可以肯定)已经更新了FlatFileItemReader的{​​{1}}。

Use this以包装您的读者。