【问题标题】:How can I integrate my own XA transaction manager with Apache Camel?如何将我自己的 XA 事务管理器与 Apache Camel 集成?
【发布时间】:2016-02-22 22:01:07
【问题描述】:

我正在尝试创建一个路由器来集成许多 JMS 主题和队列。我受制于我正在工作的客户无法更改 JMS 实现(带有一些自定义客户端库的 TibCo EMS)以及他们编写了自己的 XA 事务管理器但不太符合 JTA 规范的事实.保证消息传递非常重要。

我对 Camel 进行了大量阅读和试验,我意识到我可能需要编写自己的 JMS 组件,因为标准 JMS 组件不会与我拥有的 JMS 客户端库或 TM 集成.

我需要能够在以下几点将钩子放入路由生命周期:

  • 在路由启动期间,我需要识别所有 JMS 连接并将它们作为 XA 资源与 TM 实现一起使用

  • 当消费者收到消息时,我需要启动一个事务,包括路由中的所有 JMS 连接

  • 做出路由决策后,我需要将消息发送给生产者并提交事务

鉴于上述情况,我认为我可以实现一个非常简化的 camel-jms 组件版本,它去掉了所有 Spring 部分,只包含与我的 JMS 库交互所需的最低限度。

初始化事务管理器的最佳位置是哪里?我一直在查看 DefaultCamelContext、RoutePolicy 和 RouteContext,但我找不到所有端点都被解析和初始化的地方。

【问题讨论】:

    标签: apache-camel distributed-transactions ems


    【解决方案1】:

    我通过实现UserTransactionTransactionManager 接口并创建PlatformTransactionManager 解决了这个问题,Camel JMS 组件使用它来创建DefaultMessageListenerContainer

    需要注意的重要一点是,Camel JMSComponent 上的 transacted 属性指的是本地事务,而不是 XA 事务。如果在将 PlatformTransactionManager 传递给组件后将此属性设置为 true,则 DMLC 将有效地尝试两次提交您的事务,这将不起作用。

    这给我留下了一个很好的工作示例,从一个 JMS 代理消费并生产到另一个,但它非常很慢 - 每秒约 5 条消息。不幸的是,Spring JMS 不支持批处理,因此这里最好的解决方案似乎是调整 JMS 主题配置,以便仅在同一代理上的主题之间进行路由。

    【讨论】:

    • 你能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多