RabbitMq-队列交换机绑定关系优化为枚举注册
📚目录
- 📚简介:
- 🚀比较
- 💨通常注册
- 🌈优化后注册
- ✍️代码
- 💫自动注册的关键代码
📚简介:
该项目介绍,rabbitMq消息中间件,对队列的注册,交换机的注册,队列与交换机的绑定关系进行注册,这三个步骤进行简化,通过枚举的配置完成这些操作。可以参考之前写的文章>SpringBoot整合Rabbitmq
🚀比较
💨通常注册
通常我们创建一个队列至少三个步骤
- 声明队列
- 声明交换机
- 队列绑定到交换机上,并且且设置路由关键字

🌈优化后注册
我们只需要关注我们的队列枚举,里面已经定义好了通用配置,只有队列名称,交换机,交换机类型的指定我们需要自己定义外,之后的注册不需要你们关注即可完成。

✍️代码
💫自动注册的关键代码
RabbitMqConfig
代码的运行逻辑
- 应用启动:当 Spring Boot 应用启动时,RabbitAdmin Bean 会被初始化并启动。
- 队列和交换机的创建:在 createQueue 方法中,代码会遍历所有的队列枚举,将每个队列的相关配置(如交换机类型、持久性等)传递给相应的方法,创建所需的队列和交换机。
- 完成配置:一旦所有的交换机和队列创建完成,它们之间的绑定关系也会被设置好,从而确保消息可以在它们之间正确地流动。
/*** @author itmei*/
@Configuration
public class RabbitMqConfig {///**// * 声明队列// * @return// *///@Bean//public Queue directQueue(){// //持久 - 如果我们声明一个持久队列,则为真(该队列将在服务器重启后继续存在)// return new Queue(RabbitMqQueueEnum.DEFAULT_DIRECT.getQueueName(),false);//}/////**// * 声明交换机// * @return// *///@Bean//public DirectExchange directExchange(){// //交换器名称、是否持久化、是否自动删除// return new DirectExchange(RabbitMqQueueEnum.DEFAULT_DIRECT.getExchangeName(),true,false);//}/////***// * 队列绑定到交换机上// * 并且设置路由关键字// *///@Bean//public Binding binding(Queue queue,DirectExchange exchange){// return BindingBuilder.bind(queue).to(exchange).with(RabbitMqQueueEnum.DEFAULT_DIRECT.getRoutingKey());//}/*** 用于动态创建队列和交换机* @param rabbitTemplate rabbitMq的模板对象* @return*/@Beanpublic RabbitAdmin rabbitAdmin(RabbitTemplate rabbitTemplate){RabbitAdmin rabbitAdmin = new RabbitAdmin(rabbitTemplate);//默认就是truerabbitAdmin.setAutoStartup(true);return rabbitAdmin;}/*** 绑定* @param rabbitAdmin RabbitAdmin 实例,用于管理队列和交换机的声明* @return*/@Bean("createQueue")public Object createQueue(RabbitAdmin rabbitAdmin) {// 遍历队列枚举RabbitMqQueueEnum.toList().forEach(rabbitMqQueueEnum -> {//创建交换机createExchangeHandle(rabbitAdmin,rabbitMqQueueEnum);// 创建对列createQueueHandle(rabbitAdmin,rabbitMqQueueEnum);// 绑定交换机和对列createBindingHandle(rabbitAdmin,rabbitMqQueueEnum);});return null;}/*** 注册交换机的方法,根据传入的队列枚举配置创建相应类型的交换机。* @param rabbitAdmin RabbitAdmin 实例,用于管理队列和交换机的声明* @param rabbitMqQueueEnum 自定义队列枚举,包含交换机的配置信息,包含交换机的配置信息*/private void createExchangeHandle(RabbitAdmin rabbitAdmin, RabbitMqQueueEnum rabbitMqQueueEnum) {// 获取当前队列的交换机配置ExchangeConfigEnum exchangeConfigEnum = rabbitMqQueueEnum.getExchangeConfigEnum();String exchangeName = rabbitMqQueueEnum.getExchangeName();// 检查是否为延迟交换机if (rabbitMqQueueEnum.isDelayedExchange()) {// 创建并声明延迟交换机rabbitAdmin.declareExchange(new CustomDelayedExchange(// 交换机名称exchangeName,// 交换机是否持久化exchangeConfigEnum.isDurable(),// 交换机是否自动删除exchangeConfigEnum.isAutoDelete(),// 交换机类型exchangeConfigEnum.getType().name().toLowerCase()));} else {// 创建并声明普通交换机createStandardExchange(rabbitAdmin, exchangeName, exchangeConfigEnum);}}/*** 创建并声明标准交换机的方法。* @param rabbitAdmin RabbitAdmin 实例,用于声明交换机* @param exchangeName 交换机的名称* @param exchangeConfigEnum 交换机的配置枚举,包含持久化和自动删除等信息*/private void createStandardExchange(RabbitAdmin rabbitAdmin, String exchangeName, ExchangeConfigEnum exchangeConfigEnum) {AbstractExchange exchange;// 根据交换机类型创建对应的交换机实例switch (exchangeConfigEnum.getType()) {case FANOUT:// 创建 Fanout 交换机exchange = new FanoutExchange(exchangeName, exchangeConfigEnum.isDurable(), exchangeConfigEnum.isAutoDelete());break;case TOPIC:// 创建 Topic 交换机exchange = new TopicExchange(exchangeName, exchangeConfigEnum.isDurable(), exchangeConfigEnum.isAutoDelete());break;case DIRECT:// 创建 Direct 交换机exchange = new DirectExchange(exchangeName, exchangeConfigEnum.isDurable(), exchangeConfigEnum.isAutoDelete());break;default:// 不支持的交换机类型,直接返回return;}// 声明创建的交换机rabbitAdmin.declareExchange(exchange);}/*** 注册队列* @param rabbitAdmin RabbitAdmin 实例,用于管理队列和交换机的声明* @param rabbitMqQueueEnum 自定义队列枚举,包含交换机的配置信息*/public void createQueueHandle(RabbitAdmin rabbitAdmin, RabbitMqQueueEnum rabbitMqQueueEnum) {QueueConfigEnum queueEnum = rabbitMqQueueEnum.getQueueConfigEnum();rabbitAdmin.declareQueue(new Queue(rabbitMqQueueEnum.getQueueName(),queueEnum.isDurable(), queueEnum.isExclusive(), queueEnum.isAutoDelete(), queueEnum.getArguments()));}/*** 注册绑定关系* @param rabbitAdmin RabbitAdmin 实例,用于管理队列和交换机的声明* @param rabbitMqQueueEnum 自定义队列枚举,包含交换机的配置信息*/public void createBindingHandle(RabbitAdmin rabbitAdmin, RabbitMqQueueEnum rabbitMqQueueEnum) {// 绑定rabbitAdmin.declareBinding(new Binding(// queue名称rabbitMqQueueEnum.getQueueName(),Binding.DestinationType.QUEUE,// exchange名称rabbitMqQueueEnum.getExchangeName(),// queue的routingKeyrabbitMqQueueEnum.getRoutingKey(),null));}/*** 用于创建延迟队列的交换机*/public static class CustomDelayedExchange extends CustomExchange {public CustomDelayedExchange(String name, boolean durable, boolean autoDelete, String delayedType) {super(name, "x-delayed-message", durable, autoDelete, Collections.singletonMap("x-delayed-type", delayedType));}}
}
交换机枚举配置
/*** @Author itmei*/
@Getter
@AllArgsConstructor
public enum ExchangeConfigEnum {/*** 直接模式*/DIRECT_EXCHANGE(ExchangeModelEnum.DIRECT, true, false),/*** 匹配模式*/TOPIC_EXCHANGE(ExchangeModelEnum.TOPIC, true, false),;/*** 模式*/private final ExchangeModelEnum type;/*** 是否持久化*/private final boolean durable;/*** 是否自动删除*/private final boolean autoDelete;}
交换机枚举类型
/*** @Author itmei*/
@Getter
@AllArgsConstructor
public enum ExchangeModelEnum {/*** 广播*/FANOUT,/*** 匹配*/TOPIC,/*** 直接模式*/DIRECT
}
默认队列配置
/*** @author itmei*/
@Getter
@AllArgsConstructor
public enum QueueConfigEnum {/*** 自定义的队列配置*/DEFAULT_QUEUE_CONFIG(true, false, false, null),;/*** 是否为持久队列(该队列将在服务器重启后保留下来)*/private final boolean durable;/*** 是否为排他队列(该队列仅由声明者的队列使用连接)*/private final boolean exclusive;/*** 如果队列为空是否删除(如果服务器在不再使用队列时是否删除队列)*/private final boolean autoDelete;/*** queue的参数*/private final Map<String, Object> arguments;}
自定义队列配置(以后只需要把队列增加到这里即可)
/*** @author itmei*/
@Getter
@AllArgsConstructor
public enum RabbitMqQueueEnum {/*** 自定义的队列与交换机的关系*/DEFAULT_DIRECT("direct_itmei_exchange","direct.itmei.exchange.default.queue","direct.itmei.exchange.default.queue",ExchangeConfigEnum.DIRECT_EXCHANGE,QueueConfigEnum.DEFAULT_QUEUE_CONFIG,true,"默认队列"),DEFAULT_TEST_DIRECT("direct_itmei_exchange","direct.itmei.exchange.test.queue","direct.itmei.exchange.test.queue",ExchangeConfigEnum.DIRECT_EXCHANGE,QueueConfigEnum.DEFAULT_QUEUE_CONFIG,true,"测试对列"),;/*** 交换机名称*/private final String exchangeName;/*** 队列名称(每个队列的名称应是唯一的)*/private final String queueName ;/*** 默认保持和对列名称一样,模式为 topic时需要注意匹配符设置* 队列路由键(* 注意匹配,#匹配一个或者多个,*匹配一个* 如: abc.new.n , abc.new.n.m* abc.new.# 匹配{abc.new.n,abc.new.n.m}* abc.new.* 匹配{abc.new.n}* )*/private final String routingKey;/*** 交换机的配置*/private final ExchangeConfigEnum exchangeConfigEnum;/*** 对列的配置*/private final QueueConfigEnum queueConfigEnum;/*** 是否是延迟交换机 如果已经存在不是延迟交换机则需要删除再标记* treu:延迟交换机 false:普通交换机*/private final boolean delayedExchange;/*** 描述*/private final String desc;public static List<RabbitMqQueueEnum> toList() {return Arrays.asList(RabbitMqQueueEnum.values());}}
相关文章:
RabbitMq-队列交换机绑定关系优化为枚举注册
📚目录 📚简介:🚀比较💨通常注册🌈优化后注册 ✍️代码💫自动注册的关键代码 📚简介: 该项目介绍,rabbitMq消息中间件,对队列的注册,交换机的注册,…...
施磊C++ | 项目实战 | 手写移植SGI STL二级空间配置器内存池 项目源码
手写移植SGI STL二级空间配置器内存池 项目源码 笔者建议配合这两篇博客进行学习 侯捷 | C | 内存管理 | 学习笔记(二):第二章节 std::allocator-CSDN博客 施磊C | 项目实战 | SGI STL二级空间配置器源码剖析-CSDN博客 文章目录 手写移植SGI STL二级空…...
C++ | Leetcode C++题解之第507题完美数
题目: 题解: class Solution { public:bool checkPerfectNumber(int num) {if (num 1) {return false;}int sum 1;for (int d 2; d * d < num; d) {if (num % d 0) {sum d;if (d * d < num) {sum num / d;}}}return sum num;} };...
Git快速上手
概述 Git 是一个免费且开源的分布式版本控制系统,被广泛用于软件开发中的代码版本控制。通过使用 Git,开发者可以高效地追踪文件的变化历史,并支持多人协作开发。本教程将带你快速了解 Git 的基本概念和操作,帮助你开始使用 Git …...
宝塔如何部署Django项目(前后端分离篇)
一、环境安装 1、安装相关软件 点击软件商店,安装下面软件 一、宝塔部署前端 1、打包Vue项目 打开Vue3项目,输入下面打包命令,对Vue项目进行打包, npm run build 2、部署前端 点击宝塔的网站,在PHP项目里点击添加…...
JavaScript解析JSON对象及JSON字符串
1、问题概述? JavaScript解析JSON对象是常用功能之一。 此处我们要明确JSON对象和JSON字符串的区别?否则会给我们的解析带来困扰。 主要实现如下功能: 1、JavaScript解析JSON字符串和JSON对象? 2、JavaScript解析JSON数组? 3、JavaSc…...
Elasticsearch 构建实时数据可视化应用
Elasticsearch 构建实时数据可视化应用 Elasticsearch 构建实时数据可视化应用一、构建实时数据可视化应用的基本原则1. 数据采集2. 数据处理和清洗3. 数据存储和索引4. 数据可视化展示二、实时数据可视化应用数据存储和检索功能基于Elasticsearch构建实时数据搜索和过滤功能El…...
NVR批量管理软件/平台EasyNVR多个NVR同时管理:H.265与H.264编码优势和差异深度剖析
在数字化安防领域,视频监控系统正逐步成为各行各业不可或缺的一部分。随着技术的不断进步,传统的视频监控系统已经难以满足日益复杂和多变的监控需求。下面我们谈及NVR批量管理软件/平台EasyNVR平台H.265与H.264编码优势及差异。 一、EasyNVR视频汇聚平台…...
C/C++(六)多态
本文将介绍C的另一个基于继承的重要且复杂的机制,多态。 一、多态的概念 多态,就是多种形态,通俗来说就是不同的对象去完成某个行为,会产生不同的状态。 多态严格意义上分为静态多态与动态多态,我们平常说的多态一般…...
汽车及零配件企业海量文件数据如何管
汽车行业特点 汽车行业是工业企业皇冠上的一颗明珠,在国民经济中占据着举足轻重的地位。汽车行业具备技术密集、创新速度快、供应链复杂等特点,具体体现为: 技术密集:汽车行业是技术密集型行业,覆盖机械、电子、软件、…...
【AI学习】Mamba学习(十二):深入理解S4模型
#1024程序员节|征文# HiPPO的学习暂告一段落,按照“HiPPO->S4->Mamba 演化历程”,接着学习S4。 S4对应的论文:《Efficiently Modeling Long Sequences with Structured State Spaces》 文章链接:https://ar5iv…...
linux入门之必掌握知识点
#1024程序员节|征文# Linux基础 top命令详解 top命令是用来查看进程系统资源使用情况的工具,它可以动态的现实。 top命令执行后,按大写M可以按内存使用情况进行排序,大写P可以按CPU使用情况进行排序,大写H可以显示线…...
【Web.路由]——路由原理
这篇文章,我们来讲一讲什么是路由。 路由是 将用户请求地址映射为一个请求委托的过程,负责匹配传入的Http请求,然后将这些请求发送到应用的可执行终结点。 这里需要注意一个内容,发送到应用的可执行终结点。 路由的分类&#x…...
Spring Boot技术在中小企业设备管理中的应用
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
Lua表(Table)
软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua中的表(table)是一种核心数据结构,它既是数组也是字典,能够存储多种类型的数据,包括数字、字符…...
51单片机应用开发(进阶)---外部中断(按键+数码管显示0-F)
实现目标 1、巩固数码管、外部中断知识 2、具体实现:按键K4(INT1)每按一次,数码管从0依次递增显示至F,再按则循环显示。 一、共阳数码管 1.1 共阳数码管结构 1.2 共阳数码管码表 共阳不带小数点0-F段码为ÿ…...
怎么区分主谓宾I love you与主系表I am fine? 去掉宾语看句子完整性 主系表结构则侧重于描述主语的状态、特征或性质
主谓宾与主系表是英语句子结构中的两种基本类型,它们在关注点、动词分类以及句子完整性方面有所区别。具体分析如下: 关注点 主谓宾I love you:主谓宾结构主要关注动作和影响对象之间的关系[1]。这种结构强调的是动态和行为,通常描…...
私域流量运营的误区
私域流量运营是近年来营销领域的重要趋势,但在实际操作中,很多企业和个人容易陷入一些误区。以下是几个常见的私域流量运营误区及其解决方法: 1. 只关注流量,不重视内容 误区:许多运营者认为,只要吸引到足…...
VirtualBox虚拟机桥接模式固定ip详解
VirtualBox虚拟机桥接模式固定ip详解 VirtualBox 桥接设置Ubuntu 24.04使用固定IP问题记录 VirtualBox 桥接设置 为什么设置桥接模式?桥接模式可以实现物理机和虚拟机互相通信,虚拟机也可以访问互联网(推荐万金油),物…...
面试问题基础记录24/10/24
面试问题基础记录24/10/24 问题一:LoRA是用在节省资源的场景下,那么LoRA具体是节省了内存带宽还是显存呢?问题二:假如用pytorch完成一个分类任务,那么具体的流程是怎么样的?问题三:详细介绍一下…...
Z-Image-Turbo-rinaiqiao-huiyewunv 可视化流程设计:使用Visio绘制模型服务架构与数据流图
Z-Image-Turbo-rinaiqiao-huiyewunv 可视化流程设计:使用Visio绘制模型服务架构与数据流图 作为一名技术架构师,我经常需要向团队、客户或管理层解释一个复杂的系统是如何工作的。光靠文字描述,往往事倍功半。一张清晰的架构图或数据流图&am…...
OWL ADVENTURE Java面试题实战:手写一个简单的图像加载器
OWL ADVENTURE Java面试题实战:手写一个简单的图像加载器 最近在准备Java面试的朋友,是不是经常被问到IO、多线程这些基础?光背八股文总觉得心里没底。今天咱们换个玩法,不搞虚的,直接动手写一个能用在真实项目里的东…...
51单片机驱动DS1302:从时序解析到精准电子钟实战
1. 初识DS1302:你的第一个实时时钟芯片 第一次接触DS1302时,我盯着这个只有8个引脚的小芯片看了半天——这么小的东西真的能准确记录时间吗?事实证明它不仅做得到,而且做得很好。DS1302是Dallas公司推出的一款经典实时时钟芯片&am…...
Pixel Fashion Atelier企业应用:支持Webhook回调的自动化素材生成流水线搭建
Pixel Fashion Atelier企业应用:支持Webhook回调的自动化素材生成流水线搭建 1. 项目背景与价值 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站,专为企业级素材生产需求设计。传统AI工具往往面临两大挑战:…...
网易云音乐评论数据分析:用Python爬取+可视化热门歌曲情感倾向
网易云音乐评论数据挖掘:从爬取到情感分析的完整实战指南 音乐平台的用户评论蕴含着丰富的情感价值和商业洞察。作为国内领先的音乐社区,网易云音乐的海量评论数据对产品经理优化功能、市场人员分析用户偏好具有重要价值。本文将系统性地介绍如何通过Pyt…...
【Python 3.15 JIT终极指南】:20年CPython核心开发者亲授,从零部署到性能翻倍的5个关键跃迁
第一章:Python 3.15 JIT的诞生背景与核心设计哲学 Python 长期以来以开发效率和生态丰富性见长,但其解释执行模型在 CPU 密集型场景下始终面临性能瓶颈。CPython 的字节码解释器虽稳定可靠,却缺乏运行时优化能力;而第三方方案&…...
OpenClaw浏览器自动化:ollama-QwQ-32B驱动的研究资料收集系统
OpenClaw浏览器自动化:ollama-QwQ-32B驱动的研究资料收集系统 1. 为什么需要自动化研究资料收集 作为一名经常需要查阅大量文献的技术写作者,我长期被资料收集的效率问题困扰。传统工作流程中,我需要手动在Google Scholar、arXiv、知乎等平…...
从零到一:基于GitHub Pages与Jekyll搭建你的专属学术主页
1. 为什么选择GitHub Pages Jekyll搭建学术主页? 作为一个长期在学术界摸爬滚打的老兵,我见过太多同行花大价钱购买服务器和维护网站,结果最后因为各种技术问题半途而废。直到我发现GitHub Pages和Jekyll这对黄金组合,才真正找到…...
MecanumBase:轻量级全向轮运动学逆解C库
1. MecanumBase 库概述MecanumBase 是一个专为全向移动机器人设计的轻量级底层控制库,核心目标是将复杂的轮式运动学解耦为工程师可直观理解的输入指令:平移方向角(θ)与旋转角速度(ω)。该库不依赖任何特定…...
mmsegmentation训练策略调优全攻略:从学习率预热到迭代次数计算
mmsegmentation训练策略调优实战:从参数配置到显存优化 在图像分割领域,mmsegmentation框架因其模块化设计和丰富的预训练模型而广受欢迎。但真正决定模型性能上限的,往往是那些容易被忽视的训练策略细节。本文将带您深入AdamW优化器的参数微…...
