rabbitmq五种模式的实现——springboot
rabbitmq五种模式的实现——springboot
基础知识和javase的实现形式可以看我之前的博客
代码地址:https://github.com/9lucifer/rabbitmq4j-learning
一、进行集成
(一)Spring Boot 集成 RabbitMQ 概述
Spring Boot 提供了对 RabbitMQ 的自动配置支持,通过 RabbitTemplate 和 @RabbitListener 可以方便地实现消息的生产和消费。以下是基于 Spring Boot 的 RabbitMQ 集成示例。
(二)生产者代码解析
生产者负责创建消息并将其发送到指定的队列中。
1. 配置文件(application.yml)
spring:rabbitmq:host: 自己服务器的ip # RabbitMQ 服务器地址port: 5672 # RabbitMQ 端口号username: admin # RabbitMQ 用户名password: admin # RabbitMQ 密码virtual-host: / # 虚拟主机(默认是 /)
server:port: 8081 # 应用端口
2. 生产者代码(Controller)
package top.miqiu.controller;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class SendController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/sendMsg")public String sendMsg(@RequestParam String msg) {// 发送消息到队列 boot_queuerabbitTemplate.convertAndSend("", "boot_queue", msg);return "发送成功: " + msg;}
}
关键
- RabbitTemplate:Spring 提供的 RabbitMQ 操作模板,用于发送消息。
- convertAndSend:发送消息到指定队列。
- @GetMapping:定义一个 GET 请求接口,路径为
/sendMsg。
效果

(三)消费者代码解析
消费者负责从队列中接收并处理消息。
消费者代码(Listener)
package top.miqiu.controller;import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class Receive {@RabbitListener(queuesToDeclare = @Queue("boot_queue"))public void consumer(String msg) {System.out.println("消息内容为:" + msg);}
}
关键
- @RabbitListener:监听指定队列,当队列中有消息时,自动调用
consumer方法。 - queuesToDeclare:如果队列不存在,会自动创建队列。
效果

二、工作模式
(一)生产者
-
生产者通过
RabbitTemplate将消息发送到 RabbitMQ 的队列中。 -
关键代码解析
java复制
rabbitTemplate.convertAndSend("", "boot_work", msg + i);rabbitTemplate:RabbitMQ 的核心操作类,用于发送消息。convertAndSend方法:- 第一个参数是交换机名称(这里为空字符串,表示默认交换机)。
- 第二个参数是队列名称(
boot_work)。 - 第三个参数是消息内容(
msg + i)。
- 循环发送:代码中通过循环发送了 20 条消息,每条消息内容为
msg + i。
-
运行逻辑
生产者调用/sendMsg接口时,会将消息发送到队列boot_work中,消息内容为循环生成的字符串。
(二)消费者
-
功能描述
消费者从队列中接收消息并处理,处理完成后发送确认信号。 -
关键代码解析
@RabbitListener(queuesToDeclare = @Queue("boot_work"))@RabbitListener:注解用于监听指定队列的消息。queuesToDeclare:声明队列名称(boot_work)。@Queue:声明队列的详细信息。
public void consumer(String msg,@Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,Channel channel ) throws IOException, InterruptedException {Thread.sleep(1000); // 模拟消息处理时间channel.basicAck(deliveryTag, true); // 确认消息已处理System.out.println("消费者1 消息内容为:" + msg); }msg:接收到的消息内容。deliveryTag:消息的唯一标识,用于确认消息是否成功处理。Channel:RabbitMQ 的通道,用于执行消息确认操作。basicAck:确认消息已处理,避免消息重复发送。- 第一个参数是
deliveryTag。 - 第二个参数是
multiple,表示是否批量确认。
- 第一个参数是
-
运行逻辑
消费者监听队列boot_work,接收到消息后模拟处理时间(Thread.sleep(1000)),然后通过channel.basicAck发送确认信号,表示消息已处理完成。
(三)效果

可以看到休眠的时长不同,消费的速度不同,侧面证明该模式适用于任务分配场景,多个消费者可以并行处理任务,提高效率。
三、Pub/Sub 模式
(一)Pub/Sub 模式概述
Pub/Sub(发布/订阅)模式是一种消息传递模式,生产者将消息发送到一个交换机(Exchange),而不是直接发送到队列。消费者通过绑定交换机来接收消息。这种模式允许多个消费者订阅同一个消息源,实现消息的广播。
(二)生产者
-
功能描述
生产者通过RabbitTemplate将消息发送到一个名为boot-pubsub的交换机。 -
关键代码解析
rabbitTemplate.convertAndSend("boot-pubsub", "", msg);convertAndSend方法:- 第一个参数是交换机名称(
boot-pubsub)。 - 第二个参数是路由键(这里为空字符串,表示不指定路由键)。
- 第三个参数是消息内容(
msg)。
- 第一个参数是交换机名称(
- 交换机类型:
boot-pubsub是一个fanout类型的交换机,它会将消息广播到所有绑定的队列。
-
运行逻辑
生产者调用/sendPubsub接口时,将消息发送到boot-pubsub交换机,交换机会将消息广播到所有绑定的队列。 -
运行结果

(三)消费者
-
功能描述
消费者通过绑定到boot-pubsub交换机接收消息,并处理接收到的消息。 -
关键代码解析
@RabbitListener(bindings =@QueueBinding(value = @Queue,exchange = @Exchange(value = "boot-pubsub", type = "fanout"))) public void consumer(String msg) {System.out.println("consumer 4 消息内容为:" + msg); }@RabbitListener:注解用于监听消息。@QueueBinding:声明队列与交换机的绑定关系。value = @Queue:声明一个匿名队列。exchange = @Exchange:声明交换机的名称(boot-pubsub)和类型(fanout)。
consumer方法:处理接收到的消息,并打印消息内容。
-
运行逻辑
消费者绑定到boot-pubsub交换机,接收所有广播的消息,并打印消息内容。 -
运行效果

(四)Pub/Sub 模式特点
- 广播机制
生产者发送的消息会被广播到所有绑定到交换机的队列,多个消费者可以同时接收相同的消息。 - 解耦合
生产者和消费者之间通过交换机解耦,生产者无需知道消费者的存在,消费者也无需知道生产者的存在。 - 动态绑定
可以动态添加或移除消费者,而无需修改生产者的代码。
四、Routing 模式
(一)Routing 模式概述
Routing 模式是一种基于路由键(Routing Key)的消息路由模式。生产者将消息发送到 direct 类型的交换机,并指定一个路由键。消费者通过绑定到交换机并指定绑定键(Binding Key)来接收消息。只有路由键与绑定键完全匹配时,消息才会被路由到对应的队列。
(二)生产者
-
功能描述
生产者通过RabbitTemplate将消息发送到boot-routing交换机,并指定路由键(key)。 -
关键代码解析
rabbitTemplate.convertAndSend("boot-routing", key, msg);boot-routing:交换机名称,类型为direct。key:路由键,由方法参数传入,用于指定消息的路由规则。msg:消息内容,由方法参数传入。
-
运行逻辑
生产者调用/sendRouting接口时,将消息发送到boot-routing交换机,并通过路由键决定消息的去向。

(三)消费者
-
功能描述
消费者通过绑定到boot-routing交换机接收消息,并处理接收到的消息。 -
关键代码解析
@RabbitListener(bindings =@QueueBinding(value = @Queue,exchange = @Exchange(value = "boot-routing", type = "direct"),key = {"trace"})) public void consumer(String msg) {System.out.println("consumer 6 消息内容为:" + msg); }@RabbitListener:注解用于监听消息。@QueueBinding:声明队列与交换机的绑定关系。value = @Queue:声明一个匿名队列。exchange = @Exchange:声明交换机的名称(boot-routing)和类型(direct)。key = {"trace"}:绑定键,表示该队列只接收路由键为trace的消息。
consumer方法:处理接收到的消息,并打印消息内容。
-
运行逻辑
消费者绑定到boot-routing交换机,并通过绑定键trace接收匹配的消息。

(四)Routing 模式特点
-
精确匹配
direct类型的交换机要求路由键与绑定键完全匹配,消息才会被路由到对应的队列。 -
多队列绑定
一个交换机可以绑定多个队列,每个队列可以指定不同的绑定键。 -
解耦合
生产者和消费者之间通过交换机解耦,生产者无需知道消费者的存在,消费者也无需知道生产者的存在。
五、Topic 模式
(一)Topic 模式概述
Topic 模式是一种灵活的发布/订阅消息模式,适用于需要根据动态路由规则分发消息的场景。生产者将消息发送到一个 topic 类型的交换机,并指定一个路由键(Routing Key)。消费者通过绑定交换机并指定匹配规则(Binding Key)来接收消息。topic 类型的交换机支持模糊匹配,允许更灵活的消息路由。
(二)生产者
-
功能描述
生产者通过RabbitTemplate将消息发送到boot-topic交换机,并指定路由键(key)。 -
关键代码解析
rabbitTemplate.convertAndSend("boot-topic", key, msg);boot-topic:交换机名称,类型为topic。key:路由键,由方法参数传入,用于指定消息的路由规则。例如,user.login或user.register。msg:消息内容,由方法参数传入。
-
运行逻辑
生产者调用/sendTopic接口时,将消息发送到boot-topic交换机,并通过路由键决定消息的去向。交换机会根据绑定规则将消息路由到匹配的队列。

(三)消费者
-
功能描述
消费者通过绑定到boot-topic交换机接收消息,并处理接收到的消息。 -
关键代码解析
@RabbitListener(bindings =@QueueBinding(value = @Queue,exchange = @Exchange(value = "boot-topic", type = "topic"),key = {"user.*"})) public void consumer(String msg) {System.out.println("consumer 8 user.* 消息内容为:" + msg); }@RabbitListener:注解用于监听消息。@QueueBinding:声明队列与交换机的绑定关系。value = @Queue:声明一个匿名队列。exchange = @Exchange:声明交换机的名称(boot-topic)和类型(topic)。key = {"user.\*"}:绑定键,表示该队列只接收路由键以user.开头的消息(例如user.login或user.register)。
consumer方法:处理接收到的消息,并打印消息内容。
-
运行逻辑
消费者绑定到boot-topic交换机,并通过绑定键user.*接收匹配的消息。例如,生产者发送路由键为user.login的消息时,该消费者会接收并处理该消息。
(四)Topic 模式特点
- 灵活的路由规则
topic类型的交换机支持模糊匹配:*(星号):匹配一个单词。#(井号):匹配零个或多个单词。
- 例如,路由键为
user.login的消息可以被绑定键为user.*或user.login的队列接收。
- 动态绑定
消费者可以根据需要动态绑定不同的队列,而无需修改生产者的代码。 - 解耦合
生产者和消费者之间通过交换机解耦,生产者无需知道消费者的存在,消费者也无需知道生产者的存在。
(五)注意事项
- 交换机类型
确保交换机类型为topic,因为topic类型的交换机支持模糊匹配。 - 绑定键的正确性
消费者需要正确设置绑定键(key),否则无法接收到匹配的消息。 - 路由键的格式
路由键应使用点分隔符(.),例如user.login或trace.error,以符合topic交换机的匹配规则。 - 队列声明
如果使用匿名队列(@Queue),队列会在消费者启动时自动创建,但在 RabbitMQ 管理界面中可能看不到队列名称。如果需要持久化队列,可以显式声明队列名称。 - 消息丢失问题
如果没有消费者绑定到匹配的路由键,消息可能会丢失。可以通过设置交换机的 DLX(Dead Letter Exchange)来处理未消费的消息。
相关文章:
rabbitmq五种模式的实现——springboot
rabbitmq五种模式的实现——springboot 基础知识和javase的实现形式可以看我之前的博客 代码地址:https://github.com/9lucifer/rabbitmq4j-learning 一、进行集成 (一)Spring Boot 集成 RabbitMQ 概述 Spring Boot 提供了对 RabbitMQ 的自…...
每日学习Java之一万个为什么
9.Class <?> class1 Myclass.class 为什么要有通配符?传给谁用的? 首先,这里的class特指某个对象在JVM中的元数据集合。 有普通、接口、数组、基本类型、 void 类型、局部类、匿名类、枚举、注解 1.类型安全:通配符允许…...
寒假学习总结
整个寒假都走在数据结构与算法的路上,深入学习了其中多个板块,刷了一些与之对应的题目,下面来一期总结(c) (emmm,主播在寒假试着去学习了几大语言的语法基础(丢丢) 如Ja…...
Java Web开发实战与项目——用户认证与授权模块开发
Web应用中,用户认证与授权是至关重要的功能,确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架,支持多种认证与授权方式。在本章节中,我们将深入探讨三种常见的用户认证与授权方案:基于To…...
力扣每日一题【算法学习day.129】
前言 ###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!! 习题 1.数组列表中的最大距离 题目链接…...
uni-app发起网络请求的三种方式
uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header:设置请求的 header,header 中不能设置 Referer; method:请求方法; timeout:超时时间,单位 ms&a…...
字节火山云DeepSeek接入教程,支持联网,速度超快。
大家好,我是苍何。 在使用 DeepSeek 官网,实在是卡的我差点学猪叫,于是我一直在寻找替代方案。 要求就 2:满血,速度快。(当然能联网更好)。 我也一度使用了如硅基流动 API,发现也开…...
C语言指针学习笔记
1. 指针的定义 指针(Pointer)是存储变量地址的变量。在C语言中,指针是一种非常重要的数据类型,通过指针可以直接访问和操作内存。 2. 指针的声明与初始化 2.1 指针声明 指针变量的声明格式为:数据类型 *指针变量名…...
FreeRTOS-rust 编译分析
目录介绍 FreeRTOS-rust ├── .cargo # 对 cargo 本身的配置 │ └── config.toml ├── Cargo.toml # 对当前工作空间的配置 ├── freertos-cargo-build # 负责对 freertos 源码进行编译 │ ├── Cargo.toml # 对当前 package 进行配置 │ └…...
【解决方法】vite-plugin-svg-icons使用中出现问题[vite] Cannot find package ‘fast-glob‘
问题长这样: 参考文章:https://medium.com/wumeng9028/vite-plugin-svg-icons-error-cannot-find-package-fast-glob-8cb03d19c0ac 解决方法:pnpm add fast-glob -D package.json {"vite-plugin-svg-icons": "2.0.1"…...
[Qt] 使用QUndoStack运行到cmd->isObsolete()崩溃
redo/undo中又push了 崩溃情况崩溃原因解决方法 崩溃情况 在正常调用QUndoStack的redo/undo时,崩溃在了这里 unknown:0 QWidget: Cannot create a QWidget without QApplication. 崩溃原因 在正常调用QUndoStack的redo/undo时,因为自身的逻辑处理&a…...
大白话实战Sentinel
Sentinel是SpringCloudAlibaba提供的用来做服务保护的框架,而服务保护的常见手段就是限流和熔断降级。在大型分布式系统里面,由于微服务众多,所以服务之间的稳定性需要做特别关注,Sentinel的核心包就提供了从多个维度去保护服务稳定的策略,而且这些保护策略都可以连接上Se…...
DL/CV领域常见指标术语(FLOPS/mIoU/混淆矩阵/F1-measure)------一篇入门
1. FLOPS、FLOPs和GFLOPs FLOPS: floating-point operations per second,每秒浮点运算次数,用来衡量硬件性能。 FLOPs:floating point of operations,是浮点运算次数,用来衡量算法、模型的复杂度。 GFLOPSÿ…...
SprutCAMX16数控软件介绍
SprutCAM X 16 是一款功能强大的CAM(计算机辅助制造)软件,专为数控机床编程和制造过程优化设计。它广泛应用于机械加工、模具制造、3D打印等领域,支持多轴加工、车铣复合、机器人加工等多种加工方式。以下是SprutCAM X 16的主要特…...
Miniconda + VSCode 的Python环境搭建
目录: 安装 VScode 安装 miniconda 在VScode 使用conda虚拟环境 运行Python程序 1.安装 vscode 编辑器 官网链接:Visual Studio Code - Code Editing. Redefined 下载得到:,双击安装。 安装成功…...
TRELLIS 部署笔记
目录 依赖项安装 kaolin安装: 安装和运行报错解决 u2net.onnx 下载 解决方法,就是自行下载,然后拷贝到目录/root/.u2net bash测试u2net: 报错GaussianRasterizationSettings.__new__() got an unexpected keyword argument…...
深入解析Qt事件循环
在Qt开发中,QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作?为何耗时操作会导致界面冻结?本文将以事件循环为核心,揭示Qt高效运转的底层逻辑,探讨其设计哲学与最…...
Visual Studio Code 集成 Baidu Comate
文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标,然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮,等待安装完毕…...
「正版软件」PDF Reader - 专业 PDF 编辑阅读工具软件
PDF Reader 轻松查看、编辑、批注、转换、数字签名和管理 PDF 文件,以提高工作效率并充分利用 PDF 文档。 像专业人士一样编辑 PDF 编辑 PDF 文本 轻松添加、删除或修改 PDF 文档中的原始文本以更正错误。自定义文本属性,如颜色、字体大小、样式和粗细。…...
Kafka消息服务之Java工具类
注:此内容是本人在另一个技术平台发布的历史文章,转载发布到CSDN; Apache Kafka是一个开源分布式事件流平台,也是当前系统开发中流行的高性能消息队列服务,数千家公司使用它来实现高性能数据管道、流分析、数据集成和关…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
