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

Apache camel 如何将自己的XA事务管理器与Apache Camel集成?,apache-camel,distributed-transactions,ems,Apache Camel,Distributed Transactions,Ems,我正在尝试创建一个路由器来集成许多JMS主题和队列。我受到以下事实的限制:我工作的客户机无法更改JMS实现(带有一些自定义客户机库的TibCo EMS),并且他们编写了自己的XA事务管理器,这不完全符合JTA规范。保证消息传递非常重要 我对Camel做了很多阅读和实验,我意识到我可能需要编写自己的JMS组件,因为标准JMS组件不会与JMS客户机库或TM集成 我需要能够在以下几点将挂钩放入路由生命周期: 在路由启动期间,我需要识别所有JMS连接,并使用TM实现将它们登记为XA资源 当消费者收到消

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

我对Camel做了很多阅读和实验,我意识到我可能需要编写自己的JMS组件,因为标准JMS组件不会与JMS客户机库或TM集成

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

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

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

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

综上所述,我认为我可以实现一个非常简化的驼峰jms组件版本,它去掉了所有Spring部分,只包含与我的jms库交互所需的最低限度


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

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

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


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

您能举个例子吗?