2

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

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

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

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

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

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

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

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

4

1 回答 1

0

我通过实现UserTransactionTransactionManager接口并创建PlatformTransactionManagerCamel JMS 组件用来创建DefaultMessageListenerContainer.

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

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

于 2016-04-30T12:59:50.087 回答