骆驼构建器中的 JMSComponent>transacted=true 和 transacted()

JMSComponent>transacted=true and transacted() in camel builder

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

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 消费者路由仍然是交易。

因评论而增加

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

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