我有一个Spring Boot应用程序,它使用Hibernate JPA和一个事务处理的Camel路由。处理器使用JPA查找现有行,如果找不到,则创建该行。当并行运行时,存在竞争条件,并且路由偶尔会抛出outlineView
。简单地重新路由该路线应该可以解决问题。
当抛出异常时,事务被标记为回滚,但Camel不会启动新事务,而是尝试使用旧事务进行重新传递。
这会导致重新传递Hibernate JPA异常,例如(在异常发生后不刷新会话)
如何在进行重新传递之前让Camel结束当前的交易?
MySQLIntegrityConstraintViolationException
更新: 我想出了以下作为解决方法,但必须有一个更优雅的解决方案:
@Component
public class MyEventRouteBuilder extends SpringRouteBuilder {
@Autowired
MyEventProcessor processor;
@Autowired
PlatformTransactionManager transactionManager;
@Override
public void configure() throws Exception {
SpringTransactionPolicy requiresNew = new SpringTransactionPolicy(transactionManager);
requiresNew.setPropagationBehaviorName("PROPAGATION_REQUIRES_NEW");
errorHandler(transactionErrorHandler(requiresNew).maximumRedeliveries(2));
from("direct:myRoute")
.transacted()
.process(processor)
;
}
}