繁体   English   中英

骆驼交易不会因异常而回滚

[英]Camel transaction not rolling back on exception

我正在玩 Camel 3.13.0,但当我使用transacted时,交易似乎没有回滚。 知道为什么吗?

代码片段如下:

        DataSource dataSource = InOutTest.setupDataSource();
        //Initiate registry, transaction manager, policy
        SimpleRegistry registry = new SimpleRegistry();
        DataSourceTransactionManager transactionManager =
                new DataSourceTransactionManager(dataSource);
        registry.bind("transactionManager", transactionManager);
        SpringTransactionPolicy propagationRequired =
                new SpringTransactionPolicy();
        propagationRequired.setTransactionManager(
                transactionManager);
        propagationRequired.setPropagationBehaviorName(
                "PROPAGATION_REQUIRED");
        registry.bind("PROPAGATION_REQUIRED", propagationRequired);

        //Create context, add sql component
        SqlComponent sqlComponent = new SqlComponent();
        sqlComponent.setDataSource(dataSource);
        CamelContext context = new DefaultCamelContext(registry);
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        context.addComponent("jmsComponent", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        context.getComponent("sql", SqlComponent.class).setDataSource(InOutTest.setupDataSource());

        context.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:sqlParam")
                        .transacted("PROPAGATION_REQUIRED")
                        .to("sql:insert into articles(name, category) values ('ActiveMQ', 'activemq')")
                        .process((exchange -> {throw new RuntimeException("Mock Ex");}));
            }
        });

Apache Camel 长期以来一直支持交易 EIP 模式 配置此模式的一种方法是,就像您已经使用transacted通过 Endpoint DSL 配置所做的那样。

同时,您将PlatformTransationManager附加到DataSource

DataSourceTransactionManager transactionManager =
            new DataSourceTransactionManager(dataSource);

然后您正在配置SqlComponent以使用不同的DataSource

context.getComponent("sql", SqlComponent.class).setDataSource(InOutTest.setupDataSource());

您应该通过删除上述行来使用用于配置PlatformTransationManager的相同托管DataSource ,您应该对 go 满意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM