You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring RabbitMQ convertAndSend无报错但无法发送消息问题排查

问题解答

1. RabbitTemplate#convertAndSend 是否调用RabbitMQ管理API?

不是。Spring的RabbitTemplate基于AMQP原生协议直接与RabbitMQ服务器的AMQP端口(默认5672)建立连接发送消息,你用curl调用的是RabbitMQ的HTTP管理API(端口15672),二者是完全独立的通信方式,底层实现无关联。

2. 排查与修复方案

既然错误凭证会触发not_authorized,说明连接正常,可按以下步骤定位问题:

(1)确认Exchange与Queue的绑定关系

curl能成功发送,说明绑定本身有效,但要检查Spring代码中的绑定逻辑:

  • 若手动创建绑定:确认代码中是否执行了bindingBuilder.bind(queue).to(exchange).with(routingKey);,且参数与curl中的完全一致(比如routing key是否为my-routingkey、exchange是否为my-exchange)。
  • 若依赖自动声明:检查配置是否开启自动创建,比如spring.rabbitmq.template.exchange、spring.rabbitmq.template.routing-key是否正确,spring.rabbitmq.listener.simple.auto-startup是否设为true。

(2)开启mandatory模式排查路由问题

默认情况下,未匹配到任何队列的消息会被RabbitMQ静默丢弃。开启mandatory模式可让RabbitMQ在消息无法路由时返回错误:

rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
    System.err.printf("消息未路由: exchange=%s, routingKey=%s, 错误码=%d, 错误信息=%s%n",
            exchange, routingKey, replyCode, replyText);
});

开启后若消息无法路由,会触发回调打印具体错误,快速定位问题。

(3)检查消息序列化是否正常

你发送的是company对象,RabbitTemplate默认使用SimpleMessageConverter,若对象未实现Serializable接口,可能导致静默发送失败:

  • 让Company类实现Serializable接口:
    public class Company implements Serializable {
        // 类属性与方法
    }
    
  • 或改用JSON序列化器,配置Jackson2JsonMessageConverter:
    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
    
    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jsonMessageConverter());
        return rabbitTemplate;
    }
    

(4)验证RabbitTemplate的参数配置

  • 若代码中手动指定convertAndSend(exchange, routingkey, company),确认exchange和routingkey变量值与curl中的一致,无拼写错误。
  • 若用默认配置,检查application.properties/application.yml:
    spring.rabbitmq.template.exchange=my-exchange
    spring.rabbitmq.template.routing-key=my-routingkey
    

(5)查看RabbitMQ服务器日志

登录RabbitMQ服务器查看日志(默认路径:/var/log/rabbitmq/rabbit@<hostname>.log),日志会记录消息发送过程中的异常,比如权限不足(连接正常但无Exchange发送权限)、队列不存在等细节。

内容的提问来源于stack exchange,提问作者Jad Chahine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:42:24