我得到了以下工作:
<batch:job id="importCardsJob" job-repository="jobRepository">
<batch:step id="importCardStep">
<batch:tasklet transaction-manager="transactionManager">
<batch:chunk reader="cardItemReader" writer="cardItemWriter"
commit-interval="5" skip-limit="10">
<batch:skippable-exception-classes>
<batch:include class="java.lang.Throwable" />
</batch:skippable-exception-classes>
</batch:chunk>
<batch:no-rollback-exception-classes>
<batch:include class="job.batch.exceptions.BatchImportException"/>
</batch:no-rollback-exception-classes>
<batch:listeners>
<batch:listener ref="skipListener" />
</batch:listeners>
</batch:tasklet>
</batch:step>
<batch:listeners>
<batch:listener ref="authenticationJobListener" />
<batch:listener ref="jobListener" />
</batch:listeners>
</batch:job>
我从csv导入某些数据 . 如果出现任何问题,应跳过它,并应读取下一行 . 这就是为什么我添加了skippable-exception-classes . 我的编写器将卡存储到数据库,包括一组5张卡(由comit-interval定义) . 我不希望每一步只保存一张卡片,这就是为什么我添加了no-rollback-exception-classes . 如果csv包含任何损坏的数据,则应抛出BatchImportException(由我编写)并继续导入 . 默认情况下,从ItemWriter抛出的任何异常都将导致Step控制的事务回滚 . 但我不想要这个 . 这就是我添加no-rollback-exception-classes的原因 . 遗憾的是,在抛出BatchImportException之后,SpringBatch仍然会进行回滚 . 我甚至尝试过以下方法:
<batch:no-rollback-exception-classes>
<batch:include class="java.lang.Throwable"/>
</batch:no-rollback-exception-classes>
但即使在这种情况下,SpringBatch也会进行回滚 . 这是为什么?
1 回答
也许https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/文章可以提供帮助 .
如果从编写器或读取器/处理器抛出错误,SB会采取不同的操作,在您的情况下,可以执行回滚并且SB再次循环以检查哪个项目是错误原因 . 另外看看HELP WITH NO-ROLLBACK-EXCEPTION-CLASSES CONFIGURING