RabbitMQ 第二天 高级 7 RabbitMQ 高级特性 7.5 死信队列

news2024/10/7 8:22:57

RabbitMQ

【黑马程序员RabbitMQ全套教程,rabbitmq消息中间件到实战】

文章目录

      • RabbitMQ
      • 第二天 高级
      • 7 RabbitMQ 高级特性
        • 7.5 死信队列
          • 7.5.1 死信队列概述
          • 7.5.2 代码实现
          • 7.5.3 小结

第二天 高级

7 RabbitMQ 高级特性

7.5 死信队列

7.5.1 死信队列概述

死信队列,英文缩写:DLX 。

Dead Letter Exchange(死信交换机),当消息成为Dead message( 死信)后,可以被重新发送到另一个交换机,这个交换机就是DLX。

示意图:

在这里插入图片描述

【考虑两个问题】

  1. 队列 如何绑定 死信交换机?
  2. 消息在什么 时候成为 死信?【或者说 如何成为死信?】

【消息 成为死信的三种情况】

  • 队列消息长度到达限制;【存不下 了的消息就会成为 死信】
  • 消费者拒接消费消息,basicNack/basicReject,并且不把消息重新放入原目标队列,requeue=false;
  • 原队列存在消息过期设置【TTL】,消息到达超时时间未被消费;

【队列 绑定 死信交换机】

给队列设置参数: x-dead-letter-exchange 和 x-dead-letter-routing-key

在这里插入图片描述

7.5.2 代码实现

【修改生产者 的核心配置文件】

<!--  死信队列
        1. 声明正常的队列【test_queue_dlx】 和交换机【test_exchange_dlx】
        2. 声明死信队列【queue_dlx】 和死信交换机【exchange_dlx】
        3. 正常队列绑定 死信交换机
            设置两个参数
                * x-dead-letter-exchange:死信交换机名称
                * x-dead-letter-routing-key:发送给死信交换机的路由key
  -->
<!--  1. 声明正常的队列【test_queue_dlx】 和交换机【test_exchange_dlx】  -->
<rabbit:queue name="test_queue_dlx" id="test_queue_dlx">
    <!--3. 正常队列绑定 死信交换机-->
    <rabbit:queue-arguments>
        <!--      3.1 x-dead-letter-exchange:死信交换机名称     -->
        <entry key="x-dead-letter-exchange" value="exchange_dlx"></entry>

        <!--      3.2 x-dead-letter-routing-key:发送给死信交换机的路由key     -->
        <entry key="x-dead-letter-routing-key" value="dlx.hehe"></entry>

        <!--      4.1 设置队列的过期时间ttl      -->
        <entry key="x-message-ttl" value="10000" value-type="java.lang.Integer"></entry>

        <!--      4.2 设置队列的长度限制 max-length      -->
        <entry key="x-max-length" value="10" value-type="java.lang.Integer"></entry>

    </rabbit:queue-arguments>

</rabbit:queue>
<rabbit:topic-exchange name="test_exchange_dlx">
    <rabbit:bindings>
        <rabbit:binding pattern="test.dlx.#" queue="test_queue_dlx"></rabbit:binding>
    </rabbit:bindings>
</rabbit:topic-exchange>


<!--  2. 声明死信队列【queue_dlx】 和死信交换机【exchange_dlx】  -->
<rabbit:queue name="queue_dlx" id="queue_dlx"></rabbit:queue>
<rabbit:topic-exchange name="exchange_dlx">
    <rabbit:bindings>
        <rabbit:binding pattern="dlx.#" queue="queue_dlx"></rabbit:binding>
    </rabbit:bindings>
</rabbit:topic-exchange>

OK,现在就可以 进行消息的发送 了

直接来一个 新的测试方法

/**
 * 发送测试死信消息
 * 1. 过期时间
 * 2. 长度限制
 * 3. 消息拒收
 * */
@Test
public void testDlx(){

    //1. 测试过期时间的死信消息
    rabbitTemplate.convertAndSend("test_exchange_dlx","test.dlx.haha","我是一条要死的 消息嘛?");


}

OK,直接运行

在这里插入图片描述

效果很明显,过了 10秒 后,消息从 正常的队列 test_queue_dlx 自动到了 queue_dlx 死信队列中,而且会一直保留

在死信 队列 中读一下 这个消息

在这里插入图片描述

没问题,这就是我们发送到正常 交换机的那条消息

【这就是测试 过期时间】

【测试长度】

for (int i = 0; i < 20; i++) {
    rabbitTemplate.convertAndSend("test_exchange_dlx","test.dlx.haha","我是一条要死的 消息嘛?");
}

预期的效果:有10 条会进入正常 交换机,剩余10 条会 直接进入死信 交换机 并转发到 死信队列【加上之前那条没消费的, 就会有11 条, 而且过 10s 钟 后,全部消息 都会到达死信 队列】

运行结果

在这里插入图片描述

10s 后

在这里插入图片描述

没毛病【这就是 队列 长度的测试】

【消息拒收】

修改一下消费者代码,我们要做的就是 整一个 正常的消费者 去监听正常的那个 队列,并且在拿到 消息后,直接拒绝接收 且不让其返回 队列,观察消息是否会成为 死信,并进入死信交换机

package com.dingjiaxiong.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

/**
 * ClassName: DlxListener
 * date: 2022/11/16 21:16
 *
 * @author DingJiaxiong
 */


@Component
public class DlxListener implements ChannelAwareMessageListener {

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        long deliveryTag = message.getMessageProperties().getDeliveryTag();

        try {
            //1. 接收转换消息
            System.out.println(new String(message.getBody()));

            //2. 处理业务逻辑
            System.out.println("处理业务逻辑...");

            int i = 3 / 0; //出现异常

            //3. 手动签收
            channel.basicAck(deliveryTag, true);
        } catch (Exception e) {
//            e.printStackTrace();
            // 如果出现异常 4. 拒绝签收
            System.out.println("出现异常,拒绝签收");
            // 第三个参数:requeue:重回队列。如果设置为true,则消息重新回到queue,broker 会重新发送给该消息给消费端
            channel.basicNack(deliveryTag,true,false);

        }

    }
}

修改一下 消费端 的核心配置文件,让这个listener 监听test_queue_dlx 这个正常的 队列

<!--  定义监听器容器  -->
<rabbit:listener-container connection-factory="connectionFactory" acknowledge="manual" prefetch="1">
    <rabbit:listener ref="dlxListener" queue-names="test_queue_dlx"></rabbit:listener>
</rabbit:listener-container>

OK, 直接启动消费者测试

在这里插入图片描述

OK,这样就在一直 监听了

现在 再往正常 队列中发送一条 消息

//3. 测试消息拒收
rabbitTemplate.convertAndSend("test_exchange_dlx","test.dlx.hah","准备好,我要被拒收了...");

直接运行生产方法

在这里插入图片描述

OK,消息发送 完成,直接查看管控台

在这里插入图片描述

没毛病,拒收后的消息 也进入了死信队列

7.5.3 小结
  • 死信交换机和死信队列和普通的没有区别
  • 当消息成为死信后,如果该队列绑定了死信交换机,则消息会被死信交换机重新路由到死信队列
  • 消息成为死信的三种情况:
    • 队列消息长度到达限制;
    • 消费者拒接消费消息,并且不重回队列;
    • 原队列存在消息过期设置,消息到达超时时间未被消费;

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

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

相关文章

[LeetCode周赛复盘] 第 325 场周赛20221225

[LeetCode周赛复盘] 第 325 场周赛20221225 一、本周周赛总结二、 [Easy] 6269. 到目标字符串的最短距离1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6270. 每种字符至少取 K 个1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6271. 礼盒的最大甜蜜度1. 题目描述2. 思路分…

<Linux线程同步>——《Linux》

目录 1. Linux线程同步 1.1条件变量 1.2同步概念与竞态条件 1.3条件变量函数 1.4 为什么pthread_ cond_ wait 需要互斥量? 1.5 条件变量使用规范 后记&#xff1a;●由于作者水平有限&#xff0c;文章难免存在谬误之处&#xff0c;敬请读者斧正&#xff0c;俚语成篇&am…

论文阅读技巧

文献阅读思维 为什么你花了大量的时间来看文献却没有收获&#xff1f;那是因为你漫无目的的看文献&#xff0c;能有什么收获&#xff1f;所以我们要带着两个问题有目的的阅读文献。这个目的是什么&#xff1f;就是为了给自己找创新思路。同时在看摘要的时候你问自己第一个问题…

Mac (M1)搭建QGC地面站环境

之前朋友介绍了一个活&#xff0c;刚开始以为是针对树莓派进行二次开发。到了之后才发现&#xff0c;全新的领域&#xff0c;抱着试一试的想法就蛮答应了下来。后来在搭建环境的过程了一路受挫&#xff0c;不过就在写此文前几分钟&#xff0c;终于看到了成功的标志&#xff0c;…

2022年春秋杯网络安全联赛-冬季赛RE部分题解

easy_python python字节码 逻辑整理后就给flag flag [204, 141, 44, 236, 111, 140, 140, 76, 44, 172, 7, 7, 39, 165, 70, 7, 39, 166, 165, 134, 134, 140, 204, 165, 7, 39, 230, 140, 165, 70, 44, 172, 102, 6, 140, 204, 230, 230, 76, 198, 38, 175] for i in rang…

C++进阶(一)C++新特性:智能指针、右值引用、lambda、多线程操作、function和bind、可变模板参数

layout: post title: C进阶&#xff08;一&#xff09;C新特性&#xff1a;智能指针、右值引用、lambda、多线程操作、function和bind、可变模板参数 description: C进阶&#xff08;一&#xff09;C新特性&#xff1a;智能指针、右值引用、lambda、多线程操作、function和bind…

圣诞节来啦,快把这个动态爱心送个那个TA

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

_15LeetCode代码随想录算法训练营第十五天-C++二叉树

_15LeetCode代码随想录算法训练营第十五天-C二叉树 题目列表 110.平衡二叉树257.二叉树的所有路径404.左叶子之和 110.平衡二叉树 题目 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每…

雪花算法和uuid比较

1. 雪花算法 ​ 现在的服务基本是分布式、微服务形式的&#xff0c;而且大数据量也导致分库分表的产生&#xff0c;对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言&#xff0c;一个表中的主键 id 一般使用自增的方式&#xff0c;但是如果进行水平分表之后&…

结构体(10)

目录 1、结构体的声明 1、结构体的声明 2、结构体变量的定义和初始化 2、结构体成员的访问 3、结构体传参 1、结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1、结构体的声明 例如&#xff1a;描述一个学生 注…

KOOM线上APM监控最全剖析

APM&#xff0c;全称是Application Performance Management&#xff0c;也就是应用性能管理&#xff0c;这与我们平时写的业务可能并不相关&#xff0c;但是却承载着App线上稳定的责任。当一款App发布到线上之后&#xff0c;不同的用户有不同场景&#xff0c;一旦App出现了问题…

【云原生系列CKA备考】新建虚拟机安装Ubuntu20.04系统

目录一、环境准备二 、安装虚拟机设置网络其他操作手册&#xff1a;安装 kubeadm 一台兼容的 Linux 主机(或者云主机)。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。 每台机器 2 GB 或更多的 RAM&#xff08;如果…

数据库,计算机网络、操作系统刷题笔记18

数据库&#xff0c;计算机网络、操作系统刷题笔记18 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

红中私教:计网那点事(1)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1f342;专栏地址&#xff1a;网安专栏 光明神已陨落&#xff0c;现在 由计网引领我 破戒了&#xff0c;本来…

前端开发:Vue封装通过API调用的组件的方法

前言 在前端开发中&#xff0c;关于Vue的使用相比大家并不陌生&#xff0c;而且Vue框架的优势也是其他框架所不能比的&#xff0c;尤其是Vue的封装思想更是堪称一绝&#xff0c;还有就是组件化的运用实践过程也是亮点。所以关于Vue框架的使用想必看官都不陌生&#xff0c;而且常…

TCP 的主要特点(计算机网络-运输层)

目录 传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09; TCP 连接与面向字节流的概念 TCP 的连接 UDP与TCP复用的区别 传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09; TCP 是面向连接的运输层协议 …

【算术】数据结构

MySQL性能优化1、数据结构前言2、常见的数据结构2.1 线性表2.1.1 数组2.1.2 链表2.1.3 栈2.1.4 队列2.2 散列表2.3 树2.3.1 二叉树2.4 图1、数据结构前言 数据结构(data structure)是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合&#xff…

【工作流Activiti7】6、Activiti 7 源码学习

1. 启动分析 源码版本是 7.1.0.M6 首先从 ProcessEngineAutoConfiguration 开始 ProcessEngineAutoConfiguration 是activiti-spring-boot-starter 7.1.0.M6自动配置的入口类&#xff0c;在这里主要看 SpringProcessEngineConfiguration 主要是配置了自动部署 最最最重要的…

后渗透攻击(三)

目录 1、创建新账户 2、获取账号密码 3、远程屏幕控制 在进行提权后我们的操作空间就会大很多&#xff0c;可以进行一系列的创建新账户、获取账号密码、远程操控屏幕等等的操作。该文章就对一些常用的操作进行了整理。 1、创建新账户 查看目标靶机已存在用户 可以在meter…

[Jule CTF 2022] 部分WP

这个比赛参加的人极少&#xff0c;比赛有一星期那么长&#xff0c;快结束的时候来了个大牛&#xff0c;一下上到12000&#xff0c;我这6K只能排到第二了。不过题还是挺不错的。只是入口不是人链接&#xff0c;得自己输才能进&#xff0c;可能很多人因为这个没参加。 Crypto E…