问题描述
我们有一个设置,我们使用 spring-amqp 交易通道将我们的消息推送到 RabbitMq。在测试期间,我们发现消息甚至没有从 spring-amqp 发布到 rabbitmq;
我们怀疑 metricsCollector.basicpublish(this)
在 com.rabbitmq.client.impl.ChannelN
失败(没有抛出异常)。
因为我们可以看到,当为同一代码流执行 RabbitUtils.commitIfNecessary(channel)
时出现问题时,org.springframework.amqp.rabbit.core.RabbitTemplate
中的 metricsCollector.basicpublish(this)
没有被调用。
我们进行了 TCP 转储,可以看到消息被写入了 rabbitmq 上的流/套接字,但是由于可能的 amqp api 故障而没有发生提交,因此消息没有传送到相应的队列。
在设置中使用的jars版本:-
- spring-amqp-2.2.1.RELEASE.jar,
- spring-rabbit-2.2.1.RELEASE.jar
- amqp-client-5.7.3.jar,
- metrics-core-3.0.2.jar
有人遇到过类似的问题吗? 有人可以帮忙吗。
---编辑 1 (设置):- 我们对具有父事务的流和不与父事务一起运行的流使用相同的连接工厂
在进一步分析问题时,我们发现 isChannelLocallyTransacted
有时会表现出不一致的行为,因为 ConnectionFactoryUtils.isChannelTransactional(channel,getConnectionFactory()
有时会引用交易渠道(返回 true 因此表达式 isChannelLocallyTransacted
的计算结果为false) 由于 tx.commit 永远不会发生;所以消息在提交给 RabbitMQ 之前就丢失了。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)