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,交换机和队列绑定关系正确。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐