我怎么知道我的消息是用 spring amqp 成功发送的?
Posted
技术标签:
【中文标题】我怎么知道我的消息是用 spring amqp 成功发送的?【英文标题】:How do I know that my message was sent successfully with spring amqp? 【发布时间】:2012-01-18 02:17:49 【问题描述】:我正在使用 RabbitTemplate 类使用 spring amqp 写入 RabbitMQ 队列。我使用 convertAndSend 方法将消息发送到队列。这在正常情况下效果很好,但如果队列不存在,它似乎会静默失败。不会引发异常,并且不会将错误/调试消息记录到记录器。
对我来说确保消息已送达的最佳方式是什么?
这是代码当前正在执行的操作的示例。
RabbitTemplate template = new RabbitTemplate(factory);
template.setQueue(queueName);
template.setRoutingKey(queueName);
template.convertAndSend(message);
【问题讨论】:
您确定没有记录任何消息吗?您是否尝试过故意关闭经纪人的单元测试? 如果代理关闭,我对静默失败的说法是不正确的,如果代理关闭,我确实会收到 UnknownHostException。我已经更新了这个问题。也就是说,如果队列不存在,我仍然没有收到任何异常或错误消息。 你能把sn-p的代码贴在你发送消息的地方吗? 我添加了一个代码示例。我猜我必须注册某种监听器才能查明消息到底发生了什么,但我找不到任何支持这一点的信息。 问题可能是RabbitMQ上的定义。你确定交换、路由键和队列有正确的绑定吗?你是怎么做这个设置的?用手?你可以用 Spring 来做,如果它退出它不会覆盖定义。我的猜测是定义是错误的。 【参考方案1】:RabbitMQ 客户端向没有绑定队列以接受消息的代理发送消息不是错误。 RabbitMQ 会默默地丢弃它,客户端也不会更聪明。如果您没有对您的消息感兴趣的队列,则代理没有许多其他可用选项。
也就是说,你可以通过设置mandatory 标志让 RabbitMQ 抱怨消息是否会以静默方式结束。我不知道 Spring AMQP 接口是否支持它,但它肯定在 RabbitMQ Java 客户端库中可用。
【讨论】:
谢谢,我会调查的。明天我会努力解决的,我们现在很忙。 我看不到任何设置强制标志的方法。我使用的 spring-amqp 对象似乎都没有该设置。 我认为我的问题是该消息被视为已传递,因为它确实到达了交换机。消息永远不会路由到队列,因为它不存在。 rabbit 中可能有一些配置需要设置以确保消息不会丢失。 没有这样的配置,AFAIK(除了强制标志)。如果您在 Rabbit(或任何 AMQP 代理)中没有绑定关心该消息的队列,那么您就是在隐含地告诉代理您根本不关心该消息,并且它将永远消失。跨度> 否;只有立即标志被弃用,因为它已从兔子客户端中删除。【参考方案2】:您可以使用mandatory
,也可以启用发布者退货(对于无法送达的消息)。
【讨论】:
以上是关于我怎么知道我的消息是用 spring amqp 成功发送的?的主要内容,如果未能解决你的问题,请参考以下文章
Axon Framework 扩展 - Spring AMQP
springCloud学习-消息总线(Spring Cloud Bus)