• RabbitMQ-死信队列


    接上文 RabbitMQ-java使用消息队列

    1 死信队列简介

    在这里插入图片描述
    在这里插入图片描述

    死信队列模式实际上本质是一个死信交换机+绑定的死信队列,当正常队列的消息被判定为死信时,会被发送到对应的死信交换机,然后再通过交换机发送到死信队列中,死信队列也有对应的消费者去处理消息。

    1.1 测试第一种(消息被拒绝)

    直接在配置类中创建一个新的死信交换机和死信队列,并进行绑定:

    @Configuration
    public class RabbitConfiguration {
    
        @Bean("directDlExchange")
        public Exchange dlExchange(){
            //创建一个新的死信交换机
            return ExchangeBuilder.directExchange("dlx.direct").build();
        }
    
        @Bean("yydsDlQueue")   //创建一个新的死信队列
        public Queue dlQueue(){
            return QueueBuilder
                    .nonDurable("dl-yyds")
                    .build();
        }
    
        @Bean("dlBinding")   //死信交换机和死信队列进绑定
        public Binding dlBinding(@Qualifier("directDlExchange") Exchange exchange,
                               @Qualifier("yydsDlQueue") Queue queue){
            return BindingBuilder
                    .bind(queue)
                    .to(exchange)
                    .with("dl-yyds")
                    .noargs();
        }
    
    		...
    
        @Bean("yydsQueue")
        public Queue queue(){
            return QueueBuilder
                    .nonDurable("yyds")
                    .deadLetterExchange("dlx.direct")   //指定死信交换机
                    .deadLetterRoutingKey("dl-yyds")   //指定死信RoutingKey
                    .build();
        }
      
      	...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在这里插入图片描述
    在这里插入图片描述

    删除rabbitmq管理页面的队列,关之前把springboot的application启动类关闭,否则删除完队列马上又创建新的队列

    在这里插入图片描述

    定义死信队列监听

    @Component
    public class TestListener {
        @RabbitListener(queues = "dl-yyds", messageConverter = "jacksonConverter")
        public void receiver(User user){
            System.out.println(user);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    启动服务器application。进入rabbitmq网页管理端,可以看到出现两个队列。

    在这里插入图片描述

    查看交换机

    在这里插入图片描述

    查看dlx.direct交换机详情

    在这里插入图片描述

    向amq.direct交换机发送消息{"id":1,"name":"LB"}

    在这里插入图片描述
    在这里插入图片描述

    此时yyds队列出现一条消息

    在这里插入图片描述

    将消息拒绝使其变为死信消息。

    在这里插入图片描述

    此时死信队列监听到拒绝的信息

    在这里插入图片描述

    1.1 测试第二种(消息TTL过期)

    RabbitMQ支持将超过一定时间没被消费的消息自动删除,这需要消息队列设定TTL值,若消息的存活时间超过了Time To Live值,则会被自动删除,自动删除后的消息若有死信队列,则会进入死信队列。

    给yyds队列设定TTL值(毫秒为单位):先把服务器关闭,然后删除队列yyds

    在这里插入图片描述
    在这里插入图片描述
    启动服务,然后在amq.direct交换机详情发送消息{"id":1,"name":"LB"}
    在这里插入图片描述
    在这里插入图片描述

    不进行处理5s后死信队列会监听到消息

    在这里插入图片描述

    1.1 测试第三种(队列达到最大长度)

    关闭服务,删除yyds,在配置类添加参数,然后启动服务

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    同样在amq.direct交换机发送消息,发送三次消息分别为{"id":1,"name":"LB"},{"id":2,"name":"LB"},{"id":3,"name":"LB"}

    在这里插入图片描述

    此时消息队列3条消息

    在这里插入图片描述

    此时死信队列未监听到数据

    在这里插入图片描述

    然后再发送一条{"id":4,"name":"LB"}

    在这里插入图片描述

    然后发现死信队列监听器监听到消息,此时第四条消息把第一条挤出去了。

    在这里插入图片描述
    此时yyds队列还剩下三条消息
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    AVM赛道研究:预计2024年渗透率突破50%!下一个破局点在哪儿?
    ExposureDiffusion: Learning to Expose for Low-light Image Enhancement论文阅读笔记
    Leetcode1704:判断字符串的两半是否相似
    java计算机毕业设计华夏球迷俱乐部网站设计与实现源码+mysql数据库+系统+lw文档+部署
    短期内从一个外行变成了解行业的人
    Z-Score模型的进阶版:Zeta模型
    Hexagon_V65_Programmers_Reference_Manual (50)
    初识 PyIntObject 对象
    FFmpeg 参数
    c#基础入门
  • 原文地址:https://blog.csdn.net/weixin_43917045/article/details/133554253