如何解决消息丢失发送到 spring-amqp 的消息不会发布到 rabbitmq
我们有一个设置,我们使用 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 举报,一经查实,本站将立刻删除。