Camel AMQP 交易问题(使用 Qpid 客户端)
Camel AMQP transactions issue (with Qpid client)
我正在尝试通过我创建的 AMQP 连接添加事务,该连接是为了从我的项目连接到外部 AMQP 代理(我无权访问)。
为了使用 SSL 连接到 AMQP 代理,我使用了 Qpid 的 ConnectionFactory 实现:org.apache.qpid.amqp_1_0.jms.impl.ConnectionFactoryImpl
.
我正在连接如下内容:
URI: amqps://x.x.x.x:port?brokerlist='ssl://x.x.x.x:port'
主题:topic://topicName
一个信任库和一个密钥库
连接是从 Apache Camel (v2.14.1) 路由初始化的,Camel AMQP 组件构建在 JMS 之上,与 Apache Camel 的 AMQP 组件文档中所述完全一致(可在此处找到) : http://camel.apache.org/amqp.html 在部分 "Using Topics").
当我在未启用事务的情况下使用 AMQP 组件时,它工作得非常好。
另一方面,如果我通过以下方式启用交易:
提供一个事务管理器,它必须是接口 org.springframework.transaction.PlatformTransactionManager
作为 org.springframework.transaction.jta.JtaTransactionManager
的实现
在 Camel 端点上设置 transacted=true 配置选项
在 Camel 端点上设置 cacheLevelName=CACHE_NONE
不知何故,只有一条消息从主题中提取出来,其他的都是 lost/ignored.
日志显示事务管理器创建成功:
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: transactionManager on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: org.springframework.transaction.jta.JtaTransactionManager@1d642e2
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: cacheLevelName on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: CACHE_NONE
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: concurrentConsumers on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: 1
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: transacted on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: true
你能告诉我我做错了什么吗?
(我怀疑我连接的经纪商可能不支持交易)
我已经设法解决了这个问题(很抱歉 post 很晚才在这里给出答案)。我在这里找到了很多有用的知识:http://tmielke.blogspot.ro/2012/03/camel-jms-with-transactions-lessons.html
无论您使用哪个事务管理器(JmsTransactionManager、Atomikos 等),我所要做的就是在端点上设置选项 cacheLevelName=CACHE_CONSUMER。
如果您需要更多信息,您可以在我 post 编辑的 link 中找到所有信息。
我正在尝试通过我创建的 AMQP 连接添加事务,该连接是为了从我的项目连接到外部 AMQP 代理(我无权访问)。
为了使用 SSL 连接到 AMQP 代理,我使用了 Qpid 的 ConnectionFactory 实现:org.apache.qpid.amqp_1_0.jms.impl.ConnectionFactoryImpl
.
我正在连接如下内容:
URI: amqps://x.x.x.x:port?brokerlist='ssl://x.x.x.x:port'
主题:topic://topicName
一个信任库和一个密钥库
连接是从 Apache Camel (v2.14.1) 路由初始化的,Camel AMQP 组件构建在 JMS 之上,与 Apache Camel 的 AMQP 组件文档中所述完全一致(可在此处找到) : http://camel.apache.org/amqp.html 在部分 "Using Topics").
当我在未启用事务的情况下使用 AMQP 组件时,它工作得非常好。
另一方面,如果我通过以下方式启用交易:
提供一个事务管理器,它必须是接口
org.springframework.transaction.PlatformTransactionManager
作为org.springframework.transaction.jta.JtaTransactionManager
的实现
在 Camel 端点上设置 transacted=true 配置选项
在 Camel 端点上设置 cacheLevelName=CACHE_NONE 不知何故,只有一条消息从主题中提取出来,其他的都是 lost/ignored.
日志显示事务管理器创建成功:
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: transactionManager on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: org.springframework.transaction.jta.JtaTransactionManager@1d642e2
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: cacheLevelName on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: CACHE_NONE
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: concurrentConsumers on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: 1
DEBUG org.apache.camel.util.IntrospectionSupport: Configured property: transacted on bean: org.apache.camel.component.jms.JmsConfiguration@5b05bf with value: true
你能告诉我我做错了什么吗?
(我怀疑我连接的经纪商可能不支持交易)
我已经设法解决了这个问题(很抱歉 post 很晚才在这里给出答案)。我在这里找到了很多有用的知识:http://tmielke.blogspot.ro/2012/03/camel-jms-with-transactions-lessons.html
无论您使用哪个事务管理器(JmsTransactionManager、Atomikos 等),我所要做的就是在端点上设置选项 cacheLevelName=CACHE_CONSUMER。
如果您需要更多信息,您可以在我 post 编辑的 link 中找到所有信息。