有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring批处理回滚项

我使用Spring批处理将项目从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”处理处理器和写入程序中抛出的所有异常,但在步骤执行过程中从未调用它的读取、处理和写入方法。只有听众。调用了afterChunkError方法,但其参数不包含有关失败记录的信息。 因此,我有两个问题:

  1. 如何记录失败的项目
  2. 为什么Spring批处理不实现与ItemWriter上的行为相同的行为。写下: 失败的区块被分成大小为1的区块,然后在专用事务上处理

//更新

即使我将区块大小减少到1,也会有大约50条记录没有写入。我无法记录他们的行为


共 (1) 个答案

  1. # 1 楼答案

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