虽然定义了无回滚异常类,但Spring Batch会回滚

时间:2014-02-25 17:41:19

标签: transactions spring-batch rollback

我得到了以下工作:

<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 个答案:

答案 0 :(得分:3)

也许https://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/文章可以提供帮助 如果从编写器或读取器/处理器抛出错误,SB会采取不同的操作,并且在您的情况下可以执行回滚并且SB再次循环以检查哪个项目是错误的原因。 另请查看HELP WITH NO-ROLLBACK-EXCEPTION-CLASSES CONFIGURING