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

简介: 本项目通过枚举配置简化RabbitMQ队列、交换机及绑定关系的注册流程,实现自动化声明。只需定义队列枚举,即可完成交换机创建、队列声明与绑定,大幅减少重复代码,提升开发效率。支持直连、主题、广播及延迟交换机,配置灵活,易于维护。

📚简介:

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

🚀比较

💨通常注册

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

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

image.png

🌈优化后注册

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

image.png

✍️代码

💫自动注册的关键代码

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
     */
    @Bean
    public RabbitAdmin rabbitAdmin(RabbitTemplate rabbitTemplate){
   
        RabbitAdmin rabbitAdmin = new RabbitAdmin(rabbitTemplate);
        //默认就是true
        rabbitAdmin.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的routingKey
                rabbitMqQueueEnum.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());
    }

}
目录
相关文章
|
3月前
|
文字识别 安全 Java
验证码识别
基于Spring Boot与ONNX Runtime的OCR服务,支持D4NEW/D4OLD引擎,提供RESTful API,兼容Base64、URL及文件上传,集成Swagger文档,具备多环境配置、日志管理与跨域支持,易于扩展与部署。
153 5
|
3月前
|
JSON 网络协议 搜索推荐
反向DNS查询与蜘蛛验证免费API接口详细教程
免费反向DNS查询API,通过PTR记录与双向验证(正向解析回查)精准识别百度、Google等搜索引擎蜘蛛IP。支持GET/POST请求,返回JSON格式数据,含`is_bot`和`verified`等核心字段,适用于日志分析、流量过滤与安全监控,助力高效区分真实用户与爬虫。
126 7
|
3月前
|
监控 安全 数据处理
邮箱创建时间打标与自动删除功能设计思路
设计邮箱创建时间打标与自动删除功能,通过记录邮箱首次出现时间,结合定时清理机制,自动批量删除超期(如24小时)邮箱,避免内存泄漏。采用ConcurrentHashMap保障线程安全,异步删除服务器邮件提升性能,并提供监控统计与日志追踪,确保系统稳定高效运行。
107 1
|
3月前
|
机器学习/深度学习 存储 安全
别只会One-Hot了!20种分类编码技巧让你的特征工程更专业
分类变量需编码为数字才能被模型处理。本文详解20种编码方法,从基础的独热、序数编码到高级的目标编码、CatBoost、WOE等,涵盖适用场景与代码示例,助你提升模型性能,避免泄露与过拟合,是特征工程中不可或缺的实用指南。
199 14
别只会One-Hot了!20种分类编码技巧让你的特征工程更专业
|
3月前
|
人工智能 弹性计算 应用服务中间件
阿里云搭建网站收费标准:自建网站、云小智AI建站和云企业官网价格更新
阿里云建站三种方案:1)自购服务器,38元起/年,适合有技术者;2)万小智AI建站,698元起/年,送CN域名,零基础可操作;3)云企业官网,5480元起/年,定制设计,适合中大型企业。按需选择,性价比高。
|
3月前
|
传感器 人工智能 数据可视化
构建AI智能体:五十三、反应式应急+深思式优化:反应速度与规划智慧的平衡
智能体系统设计的混合架构研究 本文探讨了智能体系统的两种基本范式及其融合架构。反应式智能体采用&quot;感知-行动&quot;模式,具有响应速度快、资源消耗低的特点,适用于紧急场景;深思熟虑智能体采用&quot;感知-推理-行动&quot;模式,具备复杂问题求解能力,但计算成本高。研究表明,最先进的解决方案是分层混合架构:底层反应层处理紧急任务,上层深思层负责战略规划,二者通过动态交互机制协作。这种架构在扫地机器人等应用场景中展现出显著优势,既能快速应对突发情况,又能执行长期规划任务。
383 11
|
3月前
|
安全 关系型数据库 MySQL
mysql-installer-community-8.0.21.0安装使用详细步骤
下载并解压MySQL安装包至自建文件夹,运行`.msi`安装程序。选择“Server only”类型,按向导完成环境检查与文件安装。重点配置:保持默认端口3306,设置强密码认证,牢记root密码,可选开机自启。最后通过命令行输入`mysql -u root -p`验证登录,成功进入`mysql&gt;`界面即安装完成。
|
3月前
|
存储 缓存 监控
临时邮箱地址获取服务器邮件工作流程与实现
本系统实现临时邮箱生成与邮件监控功能,支持随机邮箱创建、IMAP增量拉取、并发解析及过期清理。通过内存缓存与连接池提升性能,提供接口用于获取、查询和删除临时邮箱邮件,适用于需临时收信的场景,保障安全与高效。
148 0
|
10月前
|
缓存 监控 NoSQL
Redis设计与实现——分布式Redis
Redis Sentinel 和 Cluster 是 Redis 高可用与分布式架构的核心组件。Sentinel 提供主从故障检测与自动切换,通过主观/客观下线判断及 Raft 算法选举领导者完成故障转移,但存在数据一致性和复杂度问题。Cluster 支持数据分片和水平扩展,基于哈希槽分配数据,具备自动故障转移和节点发现机制,适合大规模高并发场景。复制机制包括全量同步和部分同步,通过复制积压缓冲区优化同步效率,但仍面临延迟和资源消耗挑战。两者各有优劣,需根据业务需求选择合适方案。
713 14