Spring Boot生产者发消息时RabbitMQ无法自动创建队列如何解决?
问题根因
- 你的
msgConfiguration配置类没有添加@Configuration注解,Spring启动时不会扫描加载类中声明的队列、交换机、绑定相关的@Bean实例,RabbitMQ服务端自然不会收到资源创建请求。 - 项目配置文件
application.properties中缺少RabbitMQ服务端的基础连接配置,Spring Boot无法和RabbitMQ建立通信,无法完成队列自动创建。
修复方案
- 修改RabbitMQ配置类,添加配置类注解和Rabbit启用注解:
package com.hariri_stocks.MQ; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.TopicExchange; import org.springframework.amqp.rabbit.annotation.EnableRabbit; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; import org.springframework.amqp.support.converter.MessageConverter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @EnableRabbit public class msgConfiguration { public static final String ROUTING_KEY1 = "routingKey1"; public static final String STOCKS_EXCHANGE = "stocks_exchange"; public static final String STOCKS_QUEUE = "stocks_queue"; @Bean public Queue queue() { return new Queue(STOCKS_QUEUE , false); } @Bean public TopicExchange exchange() { return new TopicExchange(STOCKS_EXCHANGE ); } @Bean public Binding binding() { return BindingBuilder.bind(queue()).to(exchange()).with(ROUTING_KEY1); } @Bean public MessageConverter converter() { return new Jackson2JsonMessageConverter(); } @Bean public AmqpTemplate template(ConnectionFactory cf) { final RabbitTemplate rt = new RabbitTemplate(cf); rt.setMessageConverter(converter()); return rt; } }
- 在
application.properties中添加RabbitMQ连接配置:
# 原有配置保留,新增以下配置 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest # 开启RabbitMQ资源自动创建 spring.rabbitmq.dynamic=true
- 可选优化:如果不需要等待消费者返回结果,将
convertSendAndReceive改为convertAndSend,避免接口阻塞等待响应。
template.convertAndSend(msgConfiguration.STOCKS_EXCHANGE, msgConfiguration.ROUTING_KEY1,m);
内容的提问来源于stack exchange,提问作者muhammad
相关产品推荐
相关产品推荐

