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

RabbitMq-队列交换机绑定关系优化为枚举注册

📚目录

  • 📚简介:
  • 🚀比较
    • 💨通常注册
    • 🌈优化后注册
  • ✍️代码
    • 💫自动注册的关键代码

📚简介:

       该项目介绍,rabbitMq消息中间件,对队列的注册,交换机的注册,队列与交换机的绑定关系进行注册,这三个步骤进行简化,通过枚举的配置完成这些操作。可以参考之前写的文章>SpringBoot整合Rabbitmq

🚀比较

💨通常注册

通常我们创建一个队列至少三个步骤

  1. 声明队列
  2. 声明交换机
  3. 队列绑定到交换机上,并且且设置路由关键字

在这里插入图片描述

🌈优化后注册

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

在这里插入图片描述

✍️代码

💫自动注册的关键代码

RabbitMqConfig

代码的运行逻辑

  1. 应用启动:当 Spring Boot 应用启动时,RabbitAdmin Bean 会被初始化并启动。
  2. 队列和交换机的创建:在 createQueue 方法中,代码会遍历所有的队列枚举,将每个队列的相关配置(如交换机类型、持久性等)传递给相应的方法,创建所需的队列和交换机。
  3. 完成配置:一旦所有的交换机和队列创建完成,它们之间的绑定关系也会被设置好,从而确保消息可以在它们之间正确地流动。
/*** @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-队列交换机绑定关系优化为枚举注册

&#x1f4da;目录 &#x1f4da;简介:&#x1f680;比较&#x1f4a8;通常注册&#x1f308;优化后注册 ✍️代码&#x1f4ab;自动注册的关键代码 &#x1f4da;简介: 该项目介绍&#xff0c;rabbitMq消息中间件&#xff0c;对队列的注册&#xff0c;交换机的注册&#xff0c…...

施磊C++ | 项目实战 | 手写移植SGI STL二级空间配置器内存池 项目源码

手写移植SGI STL二级空间配置器内存池 项目源码 笔者建议配合这两篇博客进行学习 侯捷 | C | 内存管理 | 学习笔记&#xff08;二&#xff09;:第二章节 std::allocator-CSDN博客 施磊C | 项目实战 | SGI STL二级空间配置器源码剖析-CSDN博客 文章目录 手写移植SGI STL二级空…...

C++ | Leetcode C++题解之第507题完美数

题目&#xff1a; 题解&#xff1a; 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 是一个免费且开源的分布式版本控制系统&#xff0c;被广泛用于软件开发中的代码版本控制。通过使用 Git&#xff0c;开发者可以高效地追踪文件的变化历史&#xff0c;并支持多人协作开发。本教程将带你快速了解 Git 的基本概念和操作&#xff0c;帮助你开始使用 Git …...

宝塔如何部署Django项目(前后端分离篇)

一、环境安装 1、安装相关软件 点击软件商店&#xff0c;安装下面软件 一、宝塔部署前端 1、打包Vue项目 打开Vue3项目&#xff0c;输入下面打包命令&#xff0c;对Vue项目进行打包&#xff0c; npm run build 2、部署前端 点击宝塔的网站&#xff0c;在PHP项目里点击添加…...

JavaScript解析JSON对象及JSON字符串

1、问题概述&#xff1f; JavaScript解析JSON对象是常用功能之一。 此处我们要明确JSON对象和JSON字符串的区别&#xff1f;否则会给我们的解析带来困扰。 主要实现如下功能&#xff1a; 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编码优势和差异深度剖析

在数字化安防领域&#xff0c;视频监控系统正逐步成为各行各业不可或缺的一部分。随着技术的不断进步&#xff0c;传统的视频监控系统已经难以满足日益复杂和多变的监控需求。下面我们谈及NVR批量管理软件/平台EasyNVR平台H.265与H.264编码优势及差异。 一、EasyNVR视频汇聚平台…...

C/C++(六)多态

本文将介绍C的另一个基于继承的重要且复杂的机制&#xff0c;多态。 一、多态的概念 多态&#xff0c;就是多种形态&#xff0c;通俗来说就是不同的对象去完成某个行为&#xff0c;会产生不同的状态。 多态严格意义上分为静态多态与动态多态&#xff0c;我们平常说的多态一般…...

汽车及零配件企业海量文件数据如何管

汽车行业特点 汽车行业是工业企业皇冠上的一颗明珠&#xff0c;在国民经济中占据着举足轻重的地位。汽车行业具备技术密集、创新速度快、供应链复杂等特点&#xff0c;具体体现为&#xff1a; 技术密集&#xff1a;汽车行业是技术密集型行业&#xff0c;覆盖机械、电子、软件、…...

【AI学习】Mamba学习(十二):深入理解S4模型

#1024程序员节&#xff5c;征文# HiPPO的学习暂告一段落&#xff0c;按照“HiPPO->S4->Mamba 演化历程”&#xff0c;接着学习S4。 S4对应的论文&#xff1a;《Efficiently Modeling Long Sequences with Structured State Spaces》 文章链接&#xff1a;https://ar5iv…...

linux入门之必掌握知识点

#1024程序员节&#xff5c;征文# Linux基础 top命令详解 top命令是用来查看进程系统资源使用情况的工具&#xff0c;它可以动态的现实。 top命令执行后&#xff0c;按大写M可以按内存使用情况进行排序&#xff0c;大写P可以按CPU使用情况进行排序&#xff0c;大写H可以显示线…...

【Web.路由]——路由原理

这篇文章&#xff0c;我们来讲一讲什么是路由。 路由是 将用户请求地址映射为一个请求委托的过程&#xff0c;负责匹配传入的Http请求&#xff0c;然后将这些请求发送到应用的可执行终结点。 这里需要注意一个内容&#xff0c;发送到应用的可执行终结点。 路由的分类&#x…...

Spring Boot技术在中小企业设备管理中的应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

Lua表(Table)

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua中的表&#xff08;table&#xff09;是一种核心数据结构&#xff0c;它既是数组也是字典&#xff0c;能够存储多种类型的数据&#xff0c;包括数字、字符…...

51单片机应用开发(进阶)---外部中断(按键+数码管显示0-F)

实现目标 1、巩固数码管、外部中断知识 2、具体实现&#xff1a;按键K4&#xff08;INT1&#xff09;每按一次&#xff0c;数码管从0依次递增显示至F&#xff0c;再按则循环显示。 一、共阳数码管 1.1 共阳数码管结构 1.2 共阳数码管码表 共阳不带小数点0-F段码为&#xff…...

怎么区分主谓宾I love you与主系表I am fine? 去掉宾语看句子完整性 主系表结构则侧重于描述主语的状态、特征或性质

主谓宾与主系表是英语句子结构中的两种基本类型&#xff0c;它们在关注点、动词分类以及句子完整性方面有所区别。具体分析如下&#xff1a; 关注点 主谓宾I love you&#xff1a;主谓宾结构主要关注动作和影响对象之间的关系[1]。这种结构强调的是动态和行为&#xff0c;通常描…...

私域流量运营的误区

私域流量运营是近年来营销领域的重要趋势&#xff0c;但在实际操作中&#xff0c;很多企业和个人容易陷入一些误区。以下是几个常见的私域流量运营误区及其解决方法&#xff1a; 1. 只关注流量&#xff0c;不重视内容 误区&#xff1a;许多运营者认为&#xff0c;只要吸引到足…...

VirtualBox虚拟机桥接模式固定ip详解

VirtualBox虚拟机桥接模式固定ip详解 VirtualBox 桥接设置Ubuntu 24.04使用固定IP问题记录 VirtualBox 桥接设置 为什么设置桥接模式&#xff1f;桥接模式可以实现物理机和虚拟机互相通信&#xff0c;虚拟机也可以访问互联网&#xff08;推荐万金油&#xff09;&#xff0c;物…...

面试问题基础记录24/10/24

面试问题基础记录24/10/24 问题一&#xff1a;LoRA是用在节省资源的场景下&#xff0c;那么LoRA具体是节省了内存带宽还是显存呢&#xff1f;问题二&#xff1a;假如用pytorch完成一个分类任务&#xff0c;那么具体的流程是怎么样的&#xff1f;问题三&#xff1a;详细介绍一下…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...