RabbitMQ系列【10】死信队列

news2025/7/26 7:54:36

有道无术,术尚可求,有术无道,止于术。

文章目录

    • 概念
    • 创建死信交换机、队列
    • 过期导致死信
    • 拒接消费
    • 长度限制

概念

无法被消费的消息被称为死信,存放死信的队列也就是死信队列

由于某些特定的原因导致队列中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信

例如消费消息时,发生异常,经过一定次数的重试后,该消息依然无法被正常消费,此时可以将该消息放入死信队列中,后续进行人工干预。

消息成为死信的三种情况:

  1. 队列消息长度到达限制
  2. 消费者异常拒接消费消息
  3. 原队列存在消息过期设置,消息到达超时时间未被消费

一个简单的死信处理流程图如下:
在这里插入图片描述
流程图说明:

  1. 生产者投递消息,消费者监听队列消息
  2. 产生死信消息时,投递到死信队列
  3. 死信消费者消费死信消息,存入到数据库,并进行人工干预处理

创建死信交换机、队列

死信交换机、死信队列需要我们自己创建,只是业务中用来存放死信的“特殊”交换机队列。其他队列可以指定死信交换机、死信队列,当发生死信时,自动将其投递到死信队列中。

创建死信交换机、死信队列

@Configuration
public class RabbitMqDeadQueueConfig {

    private static final String DEAD_QUEUE = "deadQueue";

    private static final String DEAD_EXCHANGE = "deadExchange";

    private static final String DEAD_ROUTE_KEY = "dead.key";

    /**
     * 死信队列
     */
    @Bean(DEAD_QUEUE)
    public Queue deadQueue() {
        return QueueBuilder.durable(DEAD_QUEUE).build();
    }

    /**
     * 死信交换机
     */
    @Bean(DEAD_EXCHANGE)
    public Exchange deadExchange() {
        return ExchangeBuilder.directExchange(DEAD_EXCHANGE).durable(true).build();
    }

    /**
     * 创建死信队列和死信交换机的绑定关系
     */
    @Bean("deadBinding")
    public Binding deadBinding(@Qualifier(DEAD_QUEUE) Queue deadQueue, @Qualifier(DEAD_EXCHANGE) Exchange directExchange) {
        return BindingBuilder.bind(deadQueue).to(directExchange).with(DEAD_ROUTE_KEY).and(null);
    }
}

创建正常的业务消费队列,并指定指定死信交换机、路由KEY

@Configuration
public class RabbitMqConfig {

    private static final String DEAD_QUEUE = "deadQueue";

    private static final String DEAD_EXCHANGE = "deadExchange";

    private static final String DEAD_ROUTE_KEY = "dead.key";

    /**
     * 使用 ExchangeBuilder 创建交换机
     */
    @Bean("bootExchange")
    public Exchange bootExchange() {
        return ExchangeBuilder.directExchange("bootExchange").durable(true).build();
    }

    /**
     * 创建队列:
     * 指定死信交换机、路由KEY
     */
    @Bean("bootQueue")
    public Queue bootQueue001() {
        return QueueBuilder.durable("bootQueue").deadLetterExchange(DEAD_EXCHANGE).deadLetterRoutingKey(DEAD_ROUTE_KEY).build();
    }
}

创建一个死信消费者,消费死信,存入到数据库,等待人工干预处理:

    @RabbitListener(queues = {"deadQueue"})
    public void receiveMessage001(Message message) {
        System.out.println("收到死信消息" + new String(message.getBody()));
        System.out.println("存入数据库,等待人工干预");
    }

过期导致死信

首先模拟过期导致死信,注释正常业务消费者代码,发送一条TTL 消息:

        // 1. 消息过期
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration("10000");
        Message message = new Message("HELLO TTL".getBytes(), messageProperties);
        rabbitTemplate.send("bootExchange", "boot.key", message);

到了过期时间后,由于没有消费者消费该消息,成为死信,最终被死信消费者接收到:

在这里插入图片描述

拒接消费

在之前,我们介绍过消息确认ACK机制,当拒收消息时,也可以放入死信队列中。

参考上面的文档,开启手动确认模式,可以看到拒接消息后,也会存放到死信队列中:
在这里插入图片描述

长度限制

创建队列,指定长度为1,当队列中的消息已经达到了这个最大长度限制时,再次投递,消息将被挤掉,被挤掉的会进入死信队列。

    /**
     * 创建队列:
     * 指定死信交换机、路由KEY、数量限制
     */
    @Bean("bootQueue")
    public Queue bootQueue() {
        return QueueBuilder.durable("bootQueue").maxLength(1).deadLetterExchange(DEAD_EXCHANGE).deadLetterRoutingKey(DEAD_ROUTE_KEY).build();
    }

批量发送一百条消息:

        Message message = new Message("HELLO WORLD".getBytes(StandardCharsets.UTF_8));
        for (int i = 0; i < 100; i++) {
            rabbitTemplate.send("bootExchange", "boot.key", message);
        }

关闭业务监听消费者,运行发送消息,可以看到大量消息进入死信队列:
在这里插入图片描述
查看控制台,只有第一条消息被保存在队列中:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】c++栈的应用:波兰式、逆波兰式和中缀表达式计算器

********************************************************************************************************* 本文作者科大MF22某班Noah懒羊羊同学&#xff0c;为大家提供一个作业思路&#xff0c;请勿直接copy&#xff01;&#xff01;&#xff01;一起进步学习~ ********…

Mac 通过docker安装MinIO

前言 最近MeterSphere出了新版本&#xff0c;新版本架构是这样的&#xff08;如下图&#xff09;。采用了SpringCloudSpringBoot 微服务的架构的。跟以往相比&#xff0c;多了一个新的组件&#xff0c;MinIO。也就是分布式存储。 关于MinIO 1、MinIO是什么&#xff1f; 官方…

[附源码]java毕业设计某互联网公司人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【C语言】操作符详解

目录 1、操作符分类 2、算术操作符 3、移位操作符 (二进制) 3.1 左移操作符 3.2 右移操作符 4、位操作符 5、赋值操作符 6、单目操作符 6.1 单目操作符介绍 6.2 sizeof和数组 7、关系操作符 8、逻辑操作符 9、条件操作符 10、逗号表达式 11、下标引用、函…

微信对账单功能开发(V2)

下载交易账单接口开发 应用场景&#xff1a; 商户可以通过该接口下载历史交易清单。比如掉单、系统错误等导致商户侧和微信侧数据不一致&#xff0c;通过对账单核对后可校正支付状态。 注意&#xff1a; 1、微信侧未成功下单的交易不会出现在对账单中。支付成功后撤销的交易…

Azure Integrator Delphi版

Azure Integrator Delphi版 Azure Integrator包括表、队列和Blob等标准Windows Azure结构的实现&#xff0c;使开发人员能够快速轻松地将基于云的数据存储、队列管理、表配置等添加到任何桌面、Web或移动应用程序中。 Azure Integrator功能 用于访问Windows Azure表、Blob和队列…

python folium 实现地图平台制作

python实现泸定地震点观测平台制作 数据来自[走天涯徐小洋地理数据科学]&#xff0c;原始数据来自微博中国地震台网 的正式测定数据。 以下是地震点的数据&#xff1a; MagnitudeDateTimeLongitudeLatitudeDepth6.82022-9-512:52102.0829.59163.12022-9-65:28102.0729.64113…

[附源码]java毕业设计览宏公司会议管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

01. 信息搜集:Web 1~10

Web 1~10web1知识点题解web2知识点题解web3知识点题解web4知识点题解web5知识点题解web6知识点题解web7知识点题解web8知识点题解web9知识点题解web10知识点题解web1 知识点 查看网页源码&#xff1a;ctrl u 或 F12 开发注释未及时删除 题解 查看网页源码即可。 web2 知识…

学习UI设计,哪些软件是必学的

UI设计软件的学习并不重要。许多设计软件功能相似&#xff0c;操作相似&#xff0c;设计效果相似&#xff0c;此时我们只需要选择相同类型的软件进行深入学习&#xff0c;当我们掌握软件时&#xff0c;使用其他类型的软件基本上不会有太大的困难。 ​一、位图软件&#xff1a; …

spring-data-mongodb生成的Query语句order字段顺序错误

前言&#xff1a; 最近在实现一个需求的时候&#xff0c;需求要求查询的数据需要根据播放量倒叙、创建时间倒叙来排序&#xff0c;考虑到播放量、创建时间都有可能是相同的&#xff0c;就会出现排序不稳定的情况&#xff0c;于是就加入了"_id"作为第三个排序字段&am…

Unity程序在VR一体机(Android)上卡死(闪退)后怎么办?——用adb查看android上某Unity app的debug信息

一、之前面临的困境 Unity的程序build到android一体机后&#xff0c;仿佛进入了一个黑箱子&#xff0c;你既看不到脚本的debug报错信息&#xff0c;也看不到任务管理器里的内存和CPU使用情况&#xff1f;如果黑屏、闪屏、花屏怎么办&#xff1f; 最近面临的一个问题就是&…

【快速上手系列】使用七牛云+webuploader实现对象云存储(OSS)

【快速上手系列】使用七牛云webuploader实现对象云存储&#xff08;OSS&#xff09; 步骤 一、七牛云配置 1、新建存储空间 进入七牛云&#xff0c;注册登录&#xff0c;进入控制台&#xff0c;选择对象存储 Kodo 选择空间管理——新建空间&#xff08;免费30天&#xff0…

[附源码]java毕业设计企业人力资源管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Bio】基础生物学 - 基因 gene

文章目录1. DNA 脱氧核糖核酸、RNA 核糖核酸1.1 核苷酸1.2 脱氧核糖核酸1.3 核糖核酸2. 基因2.1 基因组2.2 染色体2.3 基因与脱氧核苷酸的牵连2.4 基因与DNA的牵连2.5 基因与染色体的牵连Ref1. DNA 脱氧核糖核酸、RNA 核糖核酸 1.1 核苷酸 核苷酸 (Nucleotide)\blue{\text{核苷…

如何使用家庭网络运行Aleo Prover

目前ALEO三测第二阶段太卷了&#xff0c;虽然现阶段没有激-励&#xff0c;但是仍然有不少人卷进去&#xff0c;导致现在8核的云服务器一天才只能跑出三四个scores&#xff0c;可见大家的热情还是非常高的&#xff0c;但是这对于之前购买云服务器的用户来说&#xff0c;就比较难…

全网营销如何落地?全网营销的途径有哪些?

随着移动互联网的遍及&#xff0c;如今企业的经营发展越来越离不开全网营销。有些小伙伴可能对全网营销的具体操作方法有些不解&#xff0c;这里小马识途营销顾问系统解读下全网营销。 一、 什么是全网营销&#xff1f; 全网营销是全网整合营销的简称&#xff0c;即从产品规划、…

同花顺_代码解析_技术指标_D

本文通过对同花顺中现成代码进行解析&#xff0c;用以了解同花顺相关策略设计的思想 目录 DBCD DDI DMAFS DMI DMI_QL DPO DBCD 异同离差乖离率 公式描述&#xff1a; 先计算乖离率BIAS&#xff0c;然后计算不同日的乖离率之间的离差&#xff0c; 最后对离差进行指数移…

ArcGIS pro求点线最短距离Near

ArcGIS pro求点线最短距离Near 如果是ArcGIS经典版&#xff0c;可以从以下路径找到&#xff1a; ArcGIS pro就更简单了&#xff0c;在Analysis面板&#xff1a; 打开之后来介绍一下各参数意义&#xff1a; 按照ArcGIS帮助&#xff0c;该工具可求点、线、面之间的最短距离。 其…

React-Mobx(入门)

目录 1. Mobx介绍 优势 社区评价 ​编辑 2.配置开发环境 3.基础使用 1&#xff09;初始化mobx 2&#xff09;React使用store 4.计算属性&#xff08;衍生状态&#xff09; 5.异步数据处理 6. 模块化 1&#xff09;定义task模块 2&#xff09;定义counterStore 3&am…