在使用JPA和Spring Boot事务时,Apache Camel是否支持重新传递?

时间:2015-05-18 10:57:16

标签: hibernate transactions apache-camel spring-boot spring-data-jpa

我有一个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)
        ;

    }
}

0 个答案:

没有答案