我怎么知道我的消息是用 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 成功发送的?的主要内容,如果未能解决你的问题,请参考以下文章

Spring AMQP RPC消费者并抛出异常

Spring AMQP Java 客户端中的队列大小

Axon Framework 扩展 - Spring AMQP

springCloud学习-消息总线(Spring Cloud Bus)

向 prometheus 公开 spring 集成 amqp/jms 通道消息指标

Spring消息之AMQP.