Spring Boot 整合 RabbitMQ 实现通知消息收发实验
Spring Boot 整合 RabbitMQ 实现通知消息收发实验
任务 1:启动 RabbitMQ 并查看管理界面
启动 RabbitMQ
本地安装(Windows/macOS/Linux)或使用 Docker 启动:
bash
运行
# Docker 启动 RabbitMQ(带管理界面)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
验证管理界面
打开浏览器访问:http://localhost:15672
默认账号密码:guest / guest,登录成功即可看到 RabbitMQ 管理后台。
任务 2:创建 Spring Boot 项目并配置 RabbitMQ
1. 项目依赖(pom.xml)
xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>rabbitmq-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>rabbitmq-demo</name>
<dependencies>
<!-- Spring Web(用于测试接口) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- RabbitMQ 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. 配置文件(application.yml)
yaml
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
server:
port: 8080
任务 3:声明通知消息队列
创建 RabbitMQ 配置类,声明队列、交换机(这里用直连模式,简单场景):
java
运行
package com.example.rabbitmqdemo.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
// 通知消息队列名称
public static final String NOTIFY_QUEUE = "notify_queue";
// 交换机名称
public static final String NOTIFY_EXCHANGE = "notify_exchange";
// 路由键
public static final String NOTIFY_ROUTING_KEY = "notify_routing_key";
// 声明队列
@Bean
public Queue notifyQueue() {
// durable: 队列持久化,true;exclusive: 排他,false;autoDelete: 自动删除,false
return new Queue(NOTIFY_QUEUE, true);
}
// 声明直连交换机
@Bean
public DirectExchange notifyExchange() {
return new DirectExchange(NOTIFY_EXCHANGE);
}
// 绑定队列到交换机
@Bean
public Binding notifyBinding(Queue notifyQueue, DirectExchange notifyExchange) {
return BindingBuilder.bind(notifyQueue).to(notifyExchange).with(NOTIFY_ROUTING_KEY);
}
}
任务 4:编写消息发送接口
消息发送服务类
java
运行
package com.example.rabbitmqdemo.service;
public interface NotifyService {
/**
* 发送通知消息
* @param message 消息内容
*/
void sendNotify(String message);
}
java
运行
package com.example.rabbitmqdemo.service.impl;
import com.example.rabbitmqdemo.config.RabbitMQConfig;
import com.example.rabbitmqdemo.service.NotifyService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class NotifyServiceImpl implements NotifyService {
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void sendNotify(String message) {
rabbitTemplate.convertAndSend(
RabbitMQConfig.NOTIFY_EXCHANGE,
RabbitMQConfig.NOTIFY_ROUTING_KEY,
message
);
System.out.println("消息已发送:" + message);
}
}
编写 Controller 接口(用于测试发送)
java
运行
package com.example.rabbitmqdemo.controller;
import com.example.rabbitmqdemo.service.NotifyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/notify")
public class NotifyController {
@Autowired
private NotifyService notifyService;
@GetMapping("/send")
public String sendNotify(@RequestParam String message) {
notifyService.sendNotify(message);
return "通知消息发送成功,内容:" + message;
}
}
任务 5:编写消费者接收消息
创建消费者监听类,监听队列消息:
java
运行
package com.example.rabbitmqdemo.consumer;
import com.example.rabbitmqdemo.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class NotifyConsumer {
@RabbitListener(queues = RabbitMQConfig.NOTIFY_QUEUE)
public void receiveNotify(String message) {
System.out.println("消费者收到通知消息:" + message);
// 这里可以添加业务逻辑,比如处理通知、存储日志等
}
}
验证实验结果
启动 Spring Boot 项目运行 RabbitmqDemoApplication.java,启动成功后,查看控制台,会看到队列和交换机声明的日志。
发送消息测试浏览器访问接口:
plaintext
http://localhost:8080/notify/send?message=这是一条通知消息
或使用 Postman 发送 GET 请求,参数 message 自定义。
查看结果
Spring Boot 控制台:会打印两行日志:
plaintext
消息已发送:这是一条通知消息
消费者收到通知消息:这是一条通知消息
RabbitMQ 管理界面:进入 Queues 标签页,找到 notify_queue,可以看到消息的发送、接收数量变化。
常见问题排查
连接失败:检查 RabbitMQ 是否启动,端口 5672 是否被占用,账号密码是否正确。
消息发送成功但未消费:检查 @RabbitListener 是否生效,队列名称是否和配置类一致,项目是否正确扫描到消费者类。
消息丢失:确认队列声明时 durable=true,交换机和队列绑定关系正确。
更多推荐




所有评论(0)