繁体   English   中英

春季批次回滚项目

[英]Spring Batch Rollback Items

我正在使用Spring Batch将项目从XML导入数据库。 导入后,我创建带有无效记录的日志。 我通过配置可跳过的异常来获得这些项目:

<batch:chunk reader="reader" processor="processor" writer="writer" commit-interval="10" skip-limit="99999999">
    <batch:skippable-exception-classes>
        <batch:include class="java.lang.Exception"/>
    </batch:skippable-exception-classes>
    <batch:listeners>
        <batch:listener ref="recordSkipListener"/>
        <batch:listener ref="itemReadListener"/>
    </batch:listeners>
</batch:chunk>

步骤执行后的日志:

Start time: 30.12.2015 01:05:38
End time: 30.12.2015 01:20:59
Read count: 3842
Skip count: 0
Write count: 3522

通过此表达式计算的跳过计数:

int skipCount = stepExecution.getReadSkipCount() + stepExecution.getProcessSkipCount() + stepExecution.getWriteSkipCount();

“ RecordSkipListener”处理在处理器和写入器中引发的所有异常,但在步骤执行期间从不调用其读取,处理和写入方法。 仅调用ChunkListener.afterChunkError方法,但其参数不包含有关失败记录的信息。 因此,我有两个问题:

  1. 如何记录失败的项目?
  2. 为什么Spring Batch无法实现与ItemWriter.write上的行为相同的行为:将失败的块划分为大小= 1的块,然后在专用事务上进行处理?

//更新

即使我将块大小减小到1,也不会写入大约50条记录。 而且我无法记录他们。

我将以相反的顺序回答您的问题:

为什么Spring Batch无法实现与ItemWriter.write上的行为相同的行为:将失败的块划分为大小= 1的块,然后在专用事务上进行处理?

如果在流程的处理或该步骤的写入阶段引发异常,我们可以提供导致错误的项目,因为我们有一个有效的项目。 在读取阶段发生异常的问题是,由于引发了异常,因此我们没有任何东西可以提供给任何人。 读者必须传达导致异常的输入内容的唯一方法是将有关该输入的信息嵌入到抛出的异常中。 例如,当在FlatFileItemReader中的一行解析过程中引发异常时,我们抛出FlatFileParseException 该异常具有行号和导致异常的行的内容。 您可以使用ItemReadListener#onReadError方法捕获异常,并从那里获取异常中提供的信息。

如何记录失败的项目?

借助XML,很难深入了解出了什么问题,因为这实际上不在读者的控制范围之内(这实际上是解组器的功能以及出了什么问题的功能)。 最好的办法是从记录计数中估算不良记录(通过ExecutionContext )。 那会告诉您什么数字记录导致XML文件中的错误。

这个问题的问题是,在大块提交时是个例外:实体字段之一的长度超出了允许的大小。 在这种情况下,处理和写入不会重试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM