【问题标题】:Spring Batch Rollback Items春季批量回滚项目
【发布时间】:2015-12-30 11:58:38
【问题描述】:

我正在使用 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 上相同的行为: 失败的块被分成 size=1 的块,然后在专用事务上处理?

// 更新

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

【问题讨论】:

    标签: java xml spring-batch chunks


    【解决方案1】:

    我会按相反的顺序回答你的问题:

    为什么 Spring Batch 没有实现与 ItemWriter.write 上的行为相同的行为:失败的块被分成 size=1 的块,然后在专用事务上处理?

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

    如何记录失败的项目?

    使用 XML,提供对问题所在的洞察力是很困难的,因为它实际上不在读者的控制范围内(它实际上是解组器的一个功能以及那里出了什么问题)。您可以做的最好的事情是从记录计数中估算不良记录(通过ExecutionContext)。这将告诉您在您的 XML 文件中导致错误的数字记录。

    【讨论】:

    • 迈克尔,谢谢你的回答,但我发现了我的问题。我在下面描述了它
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多