当前位置: 首页 > news >正文

Spring Boot 整合 RabbitMQ:注解声明队列与交换机详解

RabbitMQ 作为一款高性能的消息中间件,在分布式系统中广泛应用。Spring Boot 通过 spring-boot-starter-amqp 提供了对 RabbitMQ 的无缝集成,开发者可以借助注解快速声明队列、交换机及绑定规则,极大简化了配置流程。本文将通过代码示例和原理分析,详细介绍如何用注解实现 RabbitMQ 的集成,并深入解析交换机的作用与类型。


一、环境准备
1. 添加依赖

pom.xml 中引入 Spring Boot 的 AMQP 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 配置 RabbitMQ 连接

application.yml 中配置 RabbitMQ 连接信息:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /

二、注解声明队列与交换机

Spring Boot 提供 @Configuration@Bean 注解来声明队列、交换机及绑定关系,同时也支持 @RabbitListener 简化消费者监听逻辑。

1. 声明队列与交换机

创建配置类 RabbitMQConfig.java

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    // 声明 Direct 交换机
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("direct.exchange");
    }

    // 声明队列
    @Bean
    public Queue demoQueue() {
        return new Queue("demo.queue", true); // 持久化队列
    }

    // 绑定队列到交换机,并指定路由键
    @Bean
    public Binding binding(Queue demoQueue, DirectExchange directExchange) {
        return BindingBuilder.bind(demoQueue)
                .to(directExchange)
                .with("demo.routing.key");
    }
}
2. 生产者发送消息

通过 RabbitTemplate 发送消息到交换机:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MessageProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String message) {
        // 发送到交换机,指定路由键
        rabbitTemplate.convertAndSend("direct.exchange", "demo.routing.key", message);
    }
}
3. 消费者监听消息

使用 @RabbitListener 注解监听队列:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class MessageConsumer {

    @RabbitListener(queues = "demo.queue")
    public void handleMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

三、交换机(Exchange)详解
1. 交换机的作用

交换机是消息路由的核心组件,负责根据 路由规则 将生产者发送的消息分发到队列。其行为由 交换机类型绑定规则(Binding) 共同决定。

2. 常见交换机类型
交换机类型路由规则适用场景
Direct精确匹配 Routing KeyBinding Key一对一精准路由(如订单状态更新)。
Topic支持通配符 *(匹配一个词)和 #(匹配零或多个词)。多维度分类消息(如日志分级)。
Fanout忽略 Routing Key,广播到所有绑定队列。群发通知(如系统公告)。
Headers通过消息头(Headers)的键值对匹配,而非 Routing Key复杂条件路由(较少使用)。
3. 示例:Topic 交换机配置
@Configuration
public class TopicExchangeConfig {

    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange("topic.exchange");
    }

    @Bean
    public Queue topicQueue1() {
        return new Queue("topic.queue1");
    }

    @Bean
    public Queue topicQueue2() {
        return new Queue("topic.queue2");
    }

    @Bean
    public Binding binding1(TopicExchange topicExchange, Queue topicQueue1) {
        // 路由键格式:order.* 匹配 order.create、order.pay 等
        return BindingBuilder.bind(topicQueue1)
                .to(topicExchange)
                .with("order.*");
    }

    @Bean
    public Binding binding2(TopicExchange topicExchange, Queue topicQueue2) {
        // 路由键格式:order.# 匹配 order.create.success、order.pay.failed 等
        return BindingBuilder.bind(topicQueue2)
                .to(topicExchange)
                .with("order.#");
    }
}

四、高级特性:消息确认与持久化
1. 生产者确认(Publisher Confirm)

application.yml 中启用确认机制:

spring:
  rabbitmq:
    publisher-confirm-type: correlated # 异步确认
    publisher-returns: true
2. 消费者手动 ACK

修改消费者监听逻辑,手动确认消息:

@RabbitListener(queues = "demo.queue")
public void handleMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
    try {
        System.out.println("Received message: " + message);
        channel.basicAck(tag, false); // 手动确认
    } catch (IOException e) {
        channel.basicNack(tag, false, true); // 拒绝并重新入队
    }
}
3. 消息持久化

在声明队列和交换机时启用持久化:

@Bean
public Queue durableQueue() {
    return new Queue("durable.queue", true, true, false); // 参数:名称、持久化、独占、自动删除
}

@Bean
public DirectExchange durableExchange() {
    return new DirectExchange("durable.exchange", true, false); // 参数:名称、持久化、自动删除
}

五、总结

通过 Spring Boot 整合 RabbitMQ,开发者可以快速实现消息队列的声明、消息的发送与消费。核心步骤包括:

  1. 依赖配置:引入 spring-boot-starter-amqp 并配置连接信息。
  2. 注解声明:使用 @Bean 定义队列、交换机及绑定规则。
  3. 生产者与消费者:通过 RabbitTemplate 发送消息,@RabbitListener 监听队列。
  4. 交换机路由:根据业务需求选择合适的交换机类型(如 Direct、Topic)。

实际开发中,可结合消息确认、持久化等机制提升系统可靠性。理解交换机的路由规则是设计高效消息系统的关键,例如:

  • Direct Exchange 适合精准路由。
  • Topic Exchange 支持灵活的多级路由。
  • Fanout Exchange 用于广播场景。
http://www.dtcms.com/a/99796.html

相关文章:

  • 高级SQL技巧
  • Linux(8.6)rsync
  • 33. Java 流程控制语句 If-Then-Else 语句
  • [原创](现代C++ Builder 12指南): 如何使用System.JSON?
  • Gitee批量删除仓库
  • 美食菜谱数据集 | 智能体知识库 | AI大模型
  • 力扣HOT100之普通数组:41. 缺失的第一个正数
  • Cannot find a valid baseurl for repo: centos-sclo-sclo/x86_64
  • Vue实现的表格多选方案支持跨页选择和回显功能
  • DNS网络攻击:原理剖析、危害解读与全面防御指南
  • 【Python LeetCode 专题】每日一题
  • 【20期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股实时最新分时MACD数据及接口API说明文档
  • 本地缓存之Guava Cache
  • Linux CentOS 7 搭建我的世界服务器详细教程 (丐版 使用虚拟机搭建)
  • CTFshow命令执行(55-71)
  • 24_原型和原型链_this
  • GitHub上免费学习工具的精选汇总
  • 数字电路基础
  • 【Java/数据结构】优先级队列(PriorityQueue)(图文版)
  • PDF处理控件Aspose.PDF教程:通过C#、Java 和 Python删除 PDF中的水印
  • 测试cursor-AI编辑器
  • Python FastApi(8):模式的额外信息、额外数据类型
  • java网盘项目,文件和文件夹用两个表还是一个表,两个表理论查询效率慢了为啥要用,有啥优势
  • 数据结构 KMP 字符串匹配算法
  • 《Python Web部署应知应会》No2:如何基于FastAPI 和 OLLAMA 架构实现高并发 AI 推理服务
  • leetcode刷题日记——跳跃游戏 II
  • 编程语言
  • 【每日论文】DINeMo: Learning Neural Mesh Models with no 3D Annotations
  • Visual Studio中创建和配置设置文件(Settings.settings) - 详细步骤指南——待调试
  • 基于springboot小说题材在线阅读平台(源码+lw+部署文档+讲解),源码可白嫖!