【问题标题】:JMSComponent>transacted=true and transacted() in camel builder骆驼生成器中的 JMSComponent>transacted=true 和 transacted()
【发布时间】:2019-01-07 20:08:24
【问题描述】:

camel DSL 中的 transacted() 如何与 JMSComponent 的 transacted="true" 相关联。 如果 JMSComponent 的 transacted 属性与 camel DSL 中的 transacted() 一起设置为“true”,这是否有意义?

【问题讨论】:

    标签: apache-camel spring-camel


    【解决方案1】:

    JMS 组件配置中的transacted="true" 使您的 JMS 使用者进行事务处理。因此,如果您想确保不会丢失消息,这是必需的。

    但是,您有多个选项来启用事务(请参阅Camel docs for details)。

    1. 使用本地 JMS 事务
    2. 使用您自己的 Spring 事务管理器

    Camel DSL transacted() 仅在您使用第二个选项时才需要,它是 references a SpringTransactionPolicy(例如 PROPAGATION_REQUIRED)。如果它存在于您的路由中,则 Camel 正在寻找要使用的 Spring 事务管理器。

    如果您使用选项 1(如果您只与单个 JMS 代理通信,那么配置更简单并且非常适合),您不需要 Camel DSL transacted(),并且您的 JMS 消费者路由仍然是事务性的。

    由于 cmets 而添加

    要使用选项 1,您只需在 Camel 上设置 transacted="true"lazyCreateTransactionManager="false" ActiveMQComponent。你不能配置一个 Spring 事务管理器(如果你这样做了,你最终会得到两个 tx 管理器!)

    如果您想在多个 JMS 代理或一个代理和一个数据库之间进行事务处理,则需要 XA transactions 或者您必须实现补偿逻辑来处理涉及每个系统的简单事务时的边缘情况。

    【讨论】:

    • 那么,对于第 2 点,我们似乎不需要 JMSComponent 中的 transacted="true" ?这就是你所提到的。 ?
    • 否,JMS 组件配置中的 transacted="true" 始终是必需的。我刚刚编辑了我的答案以使这一点更清楚。
    • 我熟悉 Springs Platform Transaction Manager,但不确定本地 JMS 事务。能否请您详细解释一下。另外,您能否解释一下涉及多个资源(如 db 和 jms )时的事务管理
    • 没有大的细节。我添加了如何配置它,它很简单。试试看。然而,XA 交易是一个庞大而复杂的主题。我尽量避免它:-)
    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2016-08-18
    • 2018-06-27
    • 1970-01-01
    • 2023-03-10
    • 2023-04-02
    相关资源
    最近更新 更多