gpt4 book ai didi

java - Spring 批处理。使用 rollbackFor 调用方法

转载 作者:行者123 更新时间:2023-11-29 05:33:11 24 4
gpt4 key购买 nike

在一些批处理作业中,我从类中调用方法,标记为:

@Transactional(propagation = Propagation.REQUIRED, noRollbackFor = {
Fault.class,
AnotherFault.class
})
public class ...

并且,当我调用此方法并抛出异常时,我得到异常:

00:29:25,765 ERROR [org.springframework.batch.core.step.AbstractStep] (executor-2) Encountered an error executing the step: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly

为了解决这个问题,我尝试使用嵌套事务。 Jpa 不支持嵌套事务,所以我创建了虚拟类:

@Transactional(propagation = Propagation.NOT_SUPPORTED)

并从这个没有事务的虚拟类调用,我的方法有事务和 rollbackFor。

此处描述的结果:http://postgresql.1045698.n5.nabble.com/locking-problem-in-jdbc-driver-td2174897.html

因此,另一种解决此问题的方法 - 配置作业:

<batch:step id="parse-step">
<batch:tasklet>
<batch:chunk reader="xmlCommonJob.Reader"
processor="xmlCommonJob.Processor"
writer="xmlCommonJob.Writer"
commit-interval="2"/>
<batch:no-rollback-exception-classes>
<batch:include class="com.my.common.services.fault.Fault"/>
<batch:include class="com.my.common.services.fault.AnotherFault"/>
</batch:no-rollback-exception-classes>
</batch:tasklet>
<batch:next on="FAILED" to="file-failed-step"/>
<batch:next on="COMPLETED" to="file-success-step"/>
</batch:step>

一切都无济于事。

有什么想法吗?

最佳答案

在Spring Batch中我们不应该在步骤中捕获异常,对于登录数据库,我们应该使用监听器:

    <batch:step id="parse-step">
<batch:tasklet>
<batch:chunk reader="xmlCommonJob.Reader"
processor="xmlCommonJob.Processor"
writer="xmlCommonJob.Writer"
commit-interval="1">
<batch:skip-policy>
<bean class="org.springframework.batch.core.step.skip.AlwaysSkipItemSkipPolicy" scope="step"/>
</batch:skip-policy>
</batch:chunk>
</batch:tasklet>
<batch:next on="FAILED" to="file-failed-step"/>
<batch:next on="COMPLETED" to="file-success-step"/>
<batch:listeners>
<batch:listener ref="parseStepExecutionListener"/>
<batch:listener ref="parseStepSkipListener"/>
</batch:listeners>
</batch:step>

在 bean parseStepSkipListener 中,我使用记录器记录异常并可以将信息保存到数据库。

关于java - Spring 批处理。使用 rollbackFor 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com