当前位置: 首页 > 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;详细介绍一下…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...