我已设置弹出批处理作业以从 .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>
验证器,阅读器和编写器都已定义良好且工作正常。
TaskExecutor
是SimpleAsyncTaskExecutor
。
然后我篡改我的示例.csv文件以部分删除记录中的值以产生异常。正如预期的那样,会发生异常。监听器触发,但它给出错误的行号。虽然它每次都给出正确的错误输入。
如果重复运行,行号也会有所不同。例如,我篡改了我的.csv示例文件的第3行和第11行,但是监听器给了我第6行和第12行作为发生异常的记录。对于相同的篡改记录,它有时给我5号线和11号线。
关于为什么会发生这种情况的任何想法?
答案 0 :(得分:0)
如果不同步作家,则无法进行并行阅读。当第一个线程创建linecounter
时,另一个线程很可能(尽管几乎可以肯定)已经更新了FlatFileItemReader
的{{1}}。
Use this以包装您的读者。