Java 我如何知道我的消息已通过spring amqp成功发送?
我正在用spring amqp使用RabbitTemplate类写入RabbitMQ队列。我使用convertAndSend方法向队列发送消息。这在正常情况下运行良好,但如果队列不存在,它似乎会无声地失败。不会引发异常,也不会向记录器记录错误/调试消息 对我来说,什么是确保信息传递的最佳方式 下面是代码当前正在执行的操作的示例Java 我如何知道我的消息已通过spring amqp成功发送?,java,spring,rabbitmq,amqp,spring-amqp,Java,Spring,Rabbitmq,Amqp,Spring Amqp,我正在用spring amqp使用RabbitTemplate类写入RabbitMQ队列。我使用convertAndSend方法向队列发送消息。这在正常情况下运行良好,但如果队列不存在,它似乎会无声地失败。不会引发异常,也不会向记录器记录错误/调试消息 对我来说,什么是确保信息传递的最佳方式 下面是代码当前正在执行的操作的示例 RabbitTemplate template = new RabbitTemplate(factory); template.setQueue(queueName);
RabbitTemplate template = new RabbitTemplate(factory);
template.setQueue(queueName);
template.setRoutingKey(queueName);
template.convertAndSend(message);
RabbitMQ客户机向代理发送消息并不是一个错误,因为代理中没有绑定队列来接受消息。RabbitMQ将悄悄地删除它,而客户端将不会更明智。如果您没有对消息感兴趣的队列,那么代理没有很多其他可用选项
也就是说,如果通过设置标志消息将以静默方式被丢弃,则可以让RabbitMQ抱怨。我不知道Spring AMQP接口是否支持它,但RabbitMQ Java客户端库中肯定提供了它。您可以使用
强制
,还可以启用发布者返回(对于无法传递的消息)。您绝对确定没有记录任何消息吗?你有没有试过在经纪人故意倒下的情况下进行单元测试?如果经纪人倒下,我对无声失败的看法是不正确的,如果经纪人倒下,我确实会收到一个未知的异常。我已经更新了问题。也就是说,如果队列不存在,我仍然不会收到任何异常或错误消息。您能在发送消息的地方发布代码片段吗?我添加了一个代码示例。我猜我必须注册某种类型的侦听器才能了解消息到底发生了什么,但我找不到任何支持这一点的信息。问题可能是RabbitMQ上的定义。您确定exchange、路由密钥和队列具有正确的绑定吗?您是如何进行此设置的?手工您可以使用Spring执行此操作,如果它退出,它将不会覆盖定义。我猜这个定义是错误的。谢谢,我会调查的。我明天会尽力去做的,我们现在很忙。我看不出有什么办法设置强制标志。我正在使用的spring amqp对象似乎都没有这样的设置。我认为我的问题是消息被认为已传递,因为它确实到达了交换。消息永远不会路由到队列,因为它不存在。rabbit中可能有一些配置需要设置,以确保消息不会丢失。没有类似的配置,AFAIK(除了强制标志)。如果您在Rabbit(或任何AMQP代理)中没有一个关心消息的队列绑定,那么您就是在含蓄地告诉代理您根本不关心消息,消息将永远消失;只有immediate标志不推荐使用,因为它已从rabbit客户端删除。