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



我正在尝试创建一个路由器来集成许多JMS主题和队列。我受到以下事实的限制:我工作的客户端无法更改JMS实现(TibCo EMS与一些自定义客户端库),并且他们已经编写了自己的XA事务管理器,这并不完全符合JTA规范。保证消息传递非常重要。

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

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

  • 在路由启动期间,我需要识别所有 JMS 连接,并通过 TM 实现将它们登记为 XA 资源

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

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

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

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

我通过实现UserTransactionTransactionManager接口并创建一个 Camel JMS 组件用于创建DefaultMessageListenerContainerPlatformTransactionManager来解决这个问题。

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

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

最新更新