我试图创建一个路由器来集成许多JMS主题&队列。我受限于我正在为之工作的客户能够改变JMS实现(带有一些自定义客户端库的TibCo EMS),以及他们编写了自己的XA事务管理器这一事实并不完全符合与JTA规范。保证邮件传递非常重要。
我已经完成了很多阅读和试验Camel,我已经意识到我可能需要编写自己的JMS组件,因为标准的JMS组件不会与JMS客户端库集成或TM我有。
我需要能够在以下几点将钩子放入路线生命周期:
在路由启动期间,我需要识别所有JMS连接并使用TM实现将它们作为XA资源登记
当消费者收到消息时,我需要启动一个包含路径中所有JMS连接的事务
做出路由决策时,我需要将消息发送给生产者并提交交易
鉴于上述情况,我认为我可以实现一个非常简化的camel-jms组件版本,该组件剥离了所有Spring部分,并且只包含与我的JMS库交互所需的最低限度。
初始化事务管理器的最佳位置在哪里?我一直在查看DefaultCamelContext,RoutePolicy和RouteContext,但我找不到一个解析和初始化所有端点的地方。
答案 0 :(得分:0)
我通过实现UserTransaction
和TransactionManager
接口并创建了一个PlatformTransactionManager
来解决这个问题,Camel JMS组件使用它来创建DefaultMessageListenerContainer
。
需要注意的一点是,Camel transacted
上的JMSComponent
属性是指本地事务,而不是XA事务。如果在将PlatformTransactionManager
传递给组件后将此属性设置为true,则DMLC将有效地尝试将您的事务提交两次,这将无法正常工作。
这给我留下了一个很好的工作示例,它从一个JMS代理消耗并生成另一个JMS代理,但它非常慢 - 每秒约5条消息。不幸的是,Spring JMS不支持批处理,所以这里最好的解决方案似乎是调整JMS主题配置,使路由只发生在同一代理的主题之间。