当前位置: 首页 > 知识库问答 >
问题:

如何在ApacheCamelDSL中回滚事务?

虞展
2023-03-14

我为教育阿帕奇骆驼交易编写了此代码

    from("jms:SAMPLE_1")
            .transacted()
            .log("message")
            .to("jms:SAMPLE_2")
            .to("jms:SAMPLE_3")
            .log("message")
            .process(exchange -> {
                throw new Exception();
            })
           .end();

我在发生错误后使用事务处理,我必须触发事务回滚,但由于某种原因,消息保留在SAMPLE_2和SAMPLE_3队列中。为什么?
更新:
我添加了豆子

@Bean(name = "PROPAGATION_REQUIRED")
public SpringTransactionPolicy propogationRequired(PlatformTransactionManager jtaTransactionManager){
    SpringTransactionPolicy propagationRequired = new SpringTransactionPolicy();
    propagationRequired.setTransactionManager(jtaTransactionManager);
propagationRequired.setPropagationBehaviorName("PROPAGATION_REQUIRED");
    return propagationRequired;
}
@Bean
PlatformTransactionManager platformTransactionManager(ConnectionFactory cf) {
    return new JmsTransactionManager(cf);
}

并修复路线,但这对我没有帮助:

from("jms:SAMPLE_1")
            .transacted("PROPAGATION_REQUIRED")
            .log("message")
            .to("jms:SAMPLE_2")
            .to("jms:SAMPLE_3")
            .log("message")
            .process(exchange -> {
                throw new Exception();
            })
           .end();

我在文档中找到了这个配置

<blueprint ...>
<bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent">
    <property name="configuration" ref="jmsConfig" />
</bean>

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="jmsConnectionFactory" />
    <property name="transactionManager" ref="jmsTransactionManager" />
    <property name="transacted" value="true" />
</bean>
...

如何从这个xml创建bean?

共有1个答案

楚煜
2023-03-14

是的,这不起作用,因为Camel JMS组件不知道您的事务管理器等。

正如您已经发现的,缺少组件配置。

我没有使用普通的JMS组件,而是使用ActiveMQ的专用版本,但它们非常相似。所以我希望你能从这个中得到缺失的bean。

@Bean(name = "activemq") // bean name is used in URI activemq:...
public ActiveMQComponent createComponent(ConnectionFactory factory) {
    ActiveMQComponent activeMQComponent = new ActiveMQComponent();
    activeMQComponent.setConnectionFactory(factory);
    activeMQComponent.setLazyCreateTransactionManager(false);
    activeMQComponent.setTransacted(true);
    return activeMQComponent;
}

重要的

如您所见,我没有在组件中设置事务管理器。只要你只和一个经纪人交谈,你就不需要tx管理器的东西(然后你从缓存设置中获利)。使用单一经纪人的交易

  • 删除Spring事务管理器
  • 删除Spring事务策略
  • 从骆驼路由中删除 transacted()

您只需要在Camel JMS组件上设置< code>setTransacted(true)和< code > setLazyCreateTransactionManager(false),然后所有JMS使用者都会被处理。

您也可以在Camel文档中找到这两种设置。

 类似资料:
  • 我在使用@Transactional注释进行事务回滚时遇到了一个问题。 我在backingbean、service和dao类中有以下方法:

  • 我有一个由Spring框架维护的对象,我使用注释将它注入到我想要的任何DAO类中,如下所示。 我使用那些DAO类在数据库中保存如下内容。 现在,这里的两个DAO都使用了通过注入的相同的。现在,如果在之后发生异常,那么我甚至希望回滚保存的实体。但是,如何从中获取? 如果所有DAO都持有相同的对象,那么我可以直接调用类的方法吗?返回新事务或当前与关联的任何事务吗?

  • 问题内容: 调用的方法: 1. Struts Action 2.服务类方法(由@Transactional注释) 3. Xfire Web服务调用 包括struts(DelegatingActionProxy)和事务在内的所有内容都使用Spring进行配置。 持久性是通过JPA / Hibernate完成的。 有时,Web服务将引发未经检查的异常。我捕获了此异常并抛出了一个已检查的异常。我不希望事

  • 问题内容: 当服务中抛出RuntimeException时,我使用Grail的回滚功能将所有服务更新为事务性。在大多数情况下,我都这样做: 无论如何,我想验证这是否确实会回滚事务……这让我开始思考是否在这一点上已经提交了。此外,如果没有,设置flush:true会改变这一点吗?我对Spring / Hibernate如何完成所有这些工作不是很熟悉:) 问题答案: 是的,那样做。 默认情况下,Gra

  • null 通过函数注入到正在进行db操作的方法中进行monkey修补,并在测试中更改此函数 通过使sql全局化来更改猴子补丁-我不太喜欢 使数据库在测试时间内不允许删除操作 上面的每个选项似乎都不理想,我应该如何编写这个测试用例?

  • 根据 的联机丛书文档,我得到的印象是,如果 T-SQL 语句引发运行时错误,则整个事务将终止并回滚: 当 SET XACT_ABORT 处于打开状态时,如果 Transact-SQL 语句引发运行时错误,则整个事务将终止并回滚。 在 SQL 服务器 2008 R2 中对此进行测试: 给出输出: 我还认为如果出现错误,<code>将XACT_ABORT设置为ON</code>会终止批处理: SET