如何将我自己的 XA 事务管理器与 Apache Camel 集成?

How can I integrate my own XA transaction manager with Apache Camel?

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

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

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

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

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

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

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

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