我正在尝试通过我为从我的项目连接到外部AMQP代理(我无权访问)而创建的AMQP连接添加事务。
为了使用SSL连接到AMQP代理,我使用Qpid中的ConnectionFactory实现:org. apache.qpid.amqp_1_0.jms.iml.ConnectionFactoryImpl
。
我正在连接下面的东西:
>
URI: amqps://x.x.x.x:port?broklist='ssl://x.x.x:port'
topic: topic://topicName
一个信任库和一个密钥库
连接从Apache Camel(v2.14.1)路由初始化,Camel AMQP组件构建在JMS之上,与Apache Camel的AMQP组件留档中所述完全相同(可以在此处找到:http://camel.apache.org/amqp.html在“使用主题”部分)。
当我在不启用事务的情况下使用AMQP组件时,它工作得非常好。
另一方面,如果我通过以下方式启用交易:
>
提供一个事务管理器,它必须是接口org. springframe.transaction.PlatformTransactionManager
作为org.springframe.transaction.jta.JtaTransactionManager
的实现
在Camelendpoint上设置transact=true配置选项
设置cacheLevelName=CACHE_NONE在Camelendpoint上,不知何故,只有一个消息从主题中被拾取,其他所有内容都丢失/忽略。
日志显示事务管理器已成功创建:
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
你能让我知道我做错了什么吗?
(我怀疑可能我正在连接的经纪人不支持交易)
我已经设法解决了这个问题(抱歉在这里发布了很晚的答案)。我在这里找到了很多有用的知识:http://tmielke.blogspot.ro/2012/03/camel-jms-with-transactions-lessons.html
无论您使用哪个事务管理器(JmsTransactionManager、Analyikos等),我所要做的就是在endpoint上设置选项cacheLevelName=CACHE_CONSUMER。
如果您需要更多信息,您可以在我发布的链接中找到所有内容。