【发布时间】:2019-01-07 20:08:24
【问题描述】:
camel DSL 中的 transacted() 如何与 JMSComponent 的 transacted="true" 相关联。 如果 JMSComponent 的 transacted 属性与 camel DSL 中的 transacted() 一起设置为“true”,这是否有意义?
【问题讨论】:
camel DSL 中的 transacted() 如何与 JMSComponent 的 transacted="true" 相关联。 如果 JMSComponent 的 transacted 属性与 camel DSL 中的 transacted() 一起设置为“true”,这是否有意义?
【问题讨论】:
JMS 组件配置中的transacted="true" 使您的 JMS 使用者进行事务处理。因此,如果您想确保不会丢失消息,这是必需的。
但是,您有多个选项来启用事务(请参阅Camel docs for details)。
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 或者您必须实现补偿逻辑来处理涉及每个系统的简单事务时的边缘情况。
【讨论】: