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方法,但其参数不包含有关失败记录的信息。 因此,我有两个问题:
- 如何记录失败的项目李>
- 为什么Spring批处理不实现与ItemWriter上的行为相同的行为。写下: 失败的区块被分成大小为1的区块,然后在专用事务上处理李>
//更新
即使我将区块大小减少到1,也会有大约50条记录没有写入。我无法记录他们的行为
# 1 楼答案
这个问题的问题是,在区块提交时出现了异常:其中一个实体字段的长度超出了允许的大小。在这种情况下,处理和写入不会重试