spring boot 集成 rabbitmq 的核心是利用 spring-boot-starter-amqp 自动装配,通过声明 exchange、queue、binding 并配置 rabbittemplate 与 @rabbitlistener 实现异步通信。

Spring Boot 集成 RabbitMQ 实现异步通信,核心是借助 spring-boot-starter-amqp 自动装配能力,快速建立生产者-消费者模型。关键不在写多少代码,而在理解 AMQP 元素(Exchange、Queue、Binding)如何协同,并让 Spring 帮你托管连接与监听。
添加依赖和基础配置
在 pom.xml 中引入 Starter:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-amqp</artifactid></dependency>
然后在 application.yml 中配置连接参数(务必确保 RabbitMQ 服务已运行):
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
如果使用 Docker 或远程服务器,把 host 换成对应 IP,账号密码按实际设置调整。
声明 Exchange、Queue 和 Binding
Spring Boot 不会自动创建交换机和队列,需显式声明。推荐用 @Configuration 类定义 Bean:
- 定义一个直连交换机(DirectExchange)和一个队列(Queue)
- 用
BindingBuilder将它们绑定,并指定 routing key(如"order.created") - 设置
durable: true保证重启后队列不丢失(生产环境必需)
示例片段:
@Bean
public Queue orderQueue() {
return QueueBuilder.durable("queue.order").build();
}
@Bean
public DirectExchange orderExchange() {
return new DirectExchange("exchange.order");
}
@Bean
public Binding orderBinding(Queue orderQueue, DirectExchange orderExchange) {
return BindingBuilder.bind(orderQueue).to(orderExchange).with("order.created");
}
编写消息生产者
注入 RabbitTemplate,它封装了发送逻辑,支持自动序列化、确认机制等:
- 调用
convertAndSend(exchange, routingKey, object)发送对象(默认转 JSON) - 若需自定义序列化,可配置
MessageConverter(如GenericJackson2JsonMessageConverter) - 开启 publisher-confirm 后,可通过回调确认消息是否成功到达 Broker
简单发送示例:
@Service
public class OrderProducer {
@Autowired private RabbitTemplate rabbitTemplate;
public void sendOrderCreated(Order order) {
rabbitTemplate.convertAndSend(
"exchange.order",
"order.created",
order
);
}
}
编写消息消费者
使用 @RabbitListener 注解监听指定队列即可,Spring 会自动启动监听容器:
- 方法参数直接接收反序列化后的对象(前提是 MessageConverter 匹配)
- 异常未捕获时,默认重试 3 次后进入死信队列(需提前配置 DLX/DLQ)
- 建议加
@RabbitHandler处理多类型消息,或用@Payload显式标注参数
示例:
@Component
public class OrderConsumer {
@RabbitListener(queues = "queue.order")
public void onOrderCreated(@Payload Order order) {
System.out.println("处理订单:" + order.getId());
// 业务逻辑:发邮件、扣库存、更新状态...
}
}
不复杂但容易忽略:队列名、交换机名、routing key 必须与声明一致;本地测试时注意 virtual-host 默认是 /,不是空字符串;消息体建议用 POJO 而非 String,利于版本兼容和调试。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











