Rabbitmq扇形队列取消绑定交换机之后任然接收消息问题

Rabbitmq扇形队列取消绑定交换机之后任然接收消息问题

伪代码

申明队列及绑定关系

java 复制代码
package com.cdn.mqprovider;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutRabbitProviderConfig {

        /**
         * 创建三个队列 :fanout.A   fanout.B  fanout.C
         * 将三个队列都绑定在交换机 fanoutExchange 上
         * 因为是扇型交换机, 路由键无需配置,配置也不起作用
         */

        @Bean
        public Queue queueA() {
            return new Queue("fanout.A1");
        }

        @Bean
        public Queue queueB() {
            return new Queue("fanout.B1");
        }

        @Bean
        public Queue queueC() {
            return new Queue("fanout.C1");
        }

        @Bean
        FanoutExchange fanoutExchange() {
            return new FanoutExchange("fanoutExchange1");
        }

        @Bean
        Binding bindingExchangeA() {
            return BindingBuilder.bind(queueA()).to(fanoutExchange());
        }

        @Bean
        Binding bindingExchangeB() {
            return BindingBuilder.bind(queueB()).to(fanoutExchange());
        }

        @Bean
        Binding bindingExchangeC() {
            return BindingBuilder.bind(queueC()).to(fanoutExchange());
        }
    }

监听

java 复制代码
package com.cdn.mqprovider.api;

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
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.RestController;

/**
 * 蔡定努
 * 2025/10/29 17:56
 */
@RestController
public class A {

    @Autowired
    RabbitTemplate rabbitTemplate;


    /**
     * @author 蔡定努
     */
    @GetMapping("send")
    public void send() {
        rabbitTemplate.convertAndSend("fanoutExchange1", "", "消息1");
    }





    // -------------------消费----------------------
    @RabbitListener(queues = "fanout.A1",ackMode = "AUTO")
    public void processm(String testMessage) {
        System.out.println("fanout.A1消费者收到消息  : " + testMessage);
    }

    @RabbitListener(queues = "fanout.B1",ackMode = "AUTO")
    public void processmb(String testMessage) {
        System.out.println("fanout.B1消费者收到消息  : " + testMessage);
    }

    @RabbitListener(queues = "fanout.C1",ackMode = "AUTO")
    public void processmc(String testMessage) {
        System.out.println("fanout.C1消费者收到消息  : " + testMessage);
    }

}

测试

调用send接口

复制代码
fanout.C1消费者收到消息  : 消息1
fanout.A1消费者收到消息  : 消息1
fanout.B1消费者收到消息  : 消息1

调整

此时我有一个需求,fanout.A1队列我业务中用不到了,那就把写的地方拿掉就好了,于是有了以下代码

申明队列及绑定关系

java 复制代码
package com.cdn.mqprovider;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FanoutRabbitProviderConfig {

        /**
         * 创建三个队列 :fanout.A   fanout.B  fanout.C
         * 将三个队列都绑定在交换机 fanoutExchange 上
         * 因为是扇型交换机, 路由键无需配置,配置也不起作用
         */

        // @Bean
        // public Queue queueA() {
        //     return new Queue("fanout.A1");
        // }

        @Bean
        public Queue queueB() {
            return new Queue("fanout.B1");
        }

        @Bean
        public Queue queueC() {
            return new Queue("fanout.C1");
        }

        @Bean
        FanoutExchange fanoutExchange() {
            return new FanoutExchange("fanoutExchange1");
        }

        // @Bean
        // Binding bindingExchangeA() {
        //     return BindingBuilder.bind(queueA()).to(fanoutExchange());
        // }

        @Bean
        Binding bindingExchangeB() {
            return BindingBuilder.bind(queueB()).to(fanoutExchange());
        }

        @Bean
        Binding bindingExchangeC() {
            return BindingBuilder.bind(queueC()).to(fanoutExchange());
        }
    }
  1. 监听消费

    java 复制代码
    package com.cdn.mqprovider.api;
    
    import org.springframework.amqp.rabbit.annotation.Exchange;
    import org.springframework.amqp.rabbit.annotation.Queue;
    import org.springframework.amqp.rabbit.annotation.QueueBinding;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    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.RestController;
    
    /**
     * 蔡定努
     * 2025/10/29 17:56
     */
    @RestController
    public class A {
    
        @Autowired
        RabbitTemplate rabbitTemplate;
    
    
        /**
         * @author 蔡定努
         */
        @GetMapping("send")
        public void send() {
            rabbitTemplate.convertAndSend("fanoutExchange1", "", "消息1");
        }
    
    
    
    
    
        // -------------------消费----------------------
        @RabbitListener(queues = "fanout.A1",ackMode = "AUTO")
        public void processm(String testMessage) {
            System.out.println("fanout.A1消费者收到消息  : " + testMessage);
        }
    
        @RabbitListener(queues = "fanout.B1",ackMode = "AUTO")
        public void processmb(String testMessage) {
            System.out.println("fanout.B1消费者收到消息  : " + testMessage);
        }
    
        @RabbitListener(queues = "fanout.C1",ackMode = "AUTO")
        public void processmc(String testMessage) {
            System.out.println("fanout.C1消费者收到消息  : " + testMessage);
        }
    
    }

    测试

    调用send接口

    复制代码
    fanout.C1消费者收到消息  : 消息1
    fanout.A1消费者收到消息  : 消息1
    fanout.B1消费者收到消息  : 消息1

    为什么我取消绑定了,队列创建也注释了,还能消费呢?

    于是我把消费也注释了

    java 复制代码
    package com.cdn.mqprovider.api;
    
    import org.springframework.amqp.rabbit.annotation.Exchange;
    import org.springframework.amqp.rabbit.annotation.Queue;
    import org.springframework.amqp.rabbit.annotation.QueueBinding;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    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.RestController;
    
    /**
     * 蔡定努
     * 2025/10/29 17:56
     */
    @RestController
    public class A {
    
        @Autowired
        RabbitTemplate rabbitTemplate;
    
    
        /**
         * @author 蔡定努
         */
        @GetMapping("send")
        public void send() {
            rabbitTemplate.convertAndSend("fanoutExchange1", "", "消息1");
        }
    
    
    
    
    
        // -------------------消费----------------------
        // @RabbitListener(queues = "fanout.A1",ackMode = "AUTO")
        // public void processm(String testMessage) {
        //     System.out.println("fanout.A1消费者收到消息  : " + testMessage);
        // }
    
        @RabbitListener(queues = "fanout.B1",ackMode = "AUTO")
        public void processmb(String testMessage) {
            System.out.println("fanout.B1消费者收到消息  : " + testMessage);
        }
    
        @RabbitListener(queues = "fanout.C1",ackMode = "AUTO")
        public void processmc(String testMessage) {
            System.out.println("fanout.C1消费者收到消息  : " + testMessage);
        }
    
    }

    测试

    调用send接口

    复制代码
    fanout.C1消费者收到消息  : 消息1
    fanout.B1消费者收到消息  : 消息1

看似没有问题了,但是,问题就来了,随着业务的进行,mq报警了,消息堆积

原因

因为fanout.A1在之前就创建了,并且绑定关系也建立了,就算你代码中注释掉了队列申明和绑定关系,mq不会主动去删除对应的队列和绑定关系,但是消费者被注释了,所以就出现消息只进不出的情况,导致对接

解决办法

既然a队列都不要了,直接删除即可

相关推荐
霖霖总总2 小时前
[Redis小技巧32]Redis分布式锁的至暗时刻:从原理演进到时钟跳跃的终极博弈
数据库·redis·分布式
ZC跨境爬虫3 小时前
Scrapy分布式爬虫(单机模拟多节点):豆瓣Top250项目设置与数据流全解析
分布式·爬虫·python·scrapy
ZC跨境爬虫6 小时前
通俗易懂讲解分布式爬虫基础概念(附Scrapy-Redis实操教程)
redis·分布式·爬虫·python·scrapy
小红的布丁14 小时前
雪花算法:高并发场景下的分布式唯一ID生成方案解析
分布式
鲸能云14 小时前
电力安全监管新规技术解读:分布式新能源电站数字化监控体系建设实践
分布式
8Qi815 小时前
Elasticsearch 初识篇:核心概念与环境搭建
java·大数据·分布式·elasticsearch·搜索引擎·中间件
互联网散修16 小时前
鸿蒙实战:分布式数据对象实现本地、网络视频跨端迁移续播
分布式·harmonyos·跨端迁移
Albert Edison16 小时前
【RabbitMQ】发布 / 订阅模式(使用案例)
分布式·rabbitmq
Ulyanov16 小时前
ZeroMQ在分布式雷达仿真中的应用
分布式·python·信号处理·系统仿真·雷达电子对抗
身如柳絮随风扬16 小时前
分布式锁深度剖析:ZooKeeper(CP)与 Redis(AP)的实现原理与对比
redis·分布式·zookeeper