RabbitMQ --- 死信交换机(一)

news2024/11/22 11:37:26

前言

当我们在使用消息队列时,难免会遇到一些消息被拒绝重复投递或者超时等异常情况。这些异常消息如果不被正确处理,将会阻碍整个消息系统的正常运行。而此时,死信交换机(Dead Letter Exchange,简称DLX)就是一种非常有用的处理方法。它能够有效地“救活”那些无法被处理的消息,并将它们放入一个特定的队列中进行处理。

1. 何为死信

当一个队列中的消息满足下列情况之一时,可以称为死信 (dead letter):

  • 消费者使用 basic.reject 或 basic.nack 声明消费失败,并且消息的 requeue 参数设置为 false
  • 消息时一个过期消息,超时无人消费
  • 要投递的队列消息堆满了,最早的消息可能成为死信

如果该队列配置了 dead-letter-exchange 属性,指定一个交换机,那么队列中的死信会投递到交换机种,而这个交换机称为死信交换机 (Dead Letter Exchange, 简称 DLX)
在这里插入图片描述

如何给队列绑定死信交换机?

  • 给队列设置 dead-letter-exchange 属性,指定一个交换机
  • 给队列设置 dead-letter-routing-key 属性,设置死信交换机与死信队列的 RoutingKey

下面我们将通过一个简单的例子说明死信交换机的使用

2. 如何使用死信?

编写实例之前,我们先了解 TTL的概念

2.1 TTL

TTL, 也就是 Time-To-Live。如果一个队列中的消息 TTL 结束仍未消费,则变为死信,ttl 超时分为两种情况:

  • 消息所在的队列设置了存活时间
  • 消息本身设置了存活时间
  • 两者共存时,以时间短的 ttl 为准

2.2 案例

接着我们将依据下图编写案例
enter image description here

2.2.1 先声明一组死信交换机和队列 (dl.direct 和 dl.queue)

@RabbitListener(bindings = @QueueBinding(
	value = @Queue(name = "dl.queue", durable = "true"),
	exchange = @Exchange(name = "dl.direct"),
	key = "dl"
))
public void listenDlQueue(String msg){
	log.info("消费者接收到了 dl.queue的延迟消息");
}

2.2.2 声明投递消息的队列,并设置超时时间 (配置x-message-ttl 属性)

package cn.itcast.mq.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TTLMessageConfig {

	// 延时交换机
	@Bean
	public DirectExchange directExchange(){
		return new DirectExchange("ttl.direct");
	}
	
	// 延时队列
	@Bean
	public Queue ttlQueue(){
		return QueueBuilder
			.durable("ttl.queue") // 指定队列名称,并持久化
			.ttl(10000) // 设置队列超时时间,10秒
			.deadLetterExchange("dl.direct") // 指定死信交换机
			.deadLetterRoutingKey("dl") // 指定死信RoutingKey
			.build();
	}
	@Bean
	public Binding ttlBinding(){
		return BindingBuilder.bind(ttlQueue()).to(directExchange()).with("ttl");
	}
}
  • deadLetterExchange(“dl.direct”): 主要是声明队列超时后消息所投放的死信交换机

  • deadLetterRoutingKey(“dl”): 指定死信交换机的 routingKey

  • .ttl(10000) : 设置队列超时时间,10秒

2.2.3 发送消息,给消息本身设置超时时间

@Test
public void testTTLMessage(){
	// 1. 准备消息
	Message message = MessageBuilder
		.withBody("hello, ttl message".getBytes(StandardCharsets.UTF_8))
		.setDeliveryMode(MessageDeliveryMode.PERSISTENT)
		.setExpiration("5000") // 设置消息超时时间
		.build();
	// 2. 发送消息
	rabbitTemplate.convertAndSend("ttl.direct","ttl", message);
	// 3.记录日志
	log.info("消息已经成功发送!");
}

总结

消息超时的两种方式是?

  • 给队列设置 ttl 属性,进入队列后超过 ttl 时间消息变为死信
  • 给消息设置 ttl 属性,队列接收到消息超过 ttl 时间后变为死信
  • 两者共存时,以时间短的 ttl 为准

如何实现发送一个消息 20秒后消费者才能收到消息

  • 给消息的目标队列指定死信交换机
  • 消费者监听与死信交换机绑定队列
  • 发送消息时给消息设置 ttl 为 20秒

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

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

相关文章

【遇到dfs问题,点进来看看思路】【dfs本质之一 全排列思想解决大部分dfs】例题1.全排列 例题2.单词接龙

总之就是 在已知格线上,填充可用数据, 如果回退到A,那么把A之前所用数据,换一个,并且A之后的数据都重新填写 这就是全排列(截取的最关键部分,往下看) 这样的话,就是dfs的…

【节点边际电价】机组运行约束对机组节点边际电价的影响分析(Matlab代码实现)​

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

2023年美国大学生数学建模竞赛F题绿色GDP解题全过程文档及程序

2023年美国大学生数学建模竞赛 F题 绿色GDP 原题再现: 背景   国内生产总值(GDP)可以说是衡量-一个国家经济健康状况的最知名和最常用的指标之一。它通常被用于确定一个国家的购买力和获得贷款的机会,为国家提出促进其gdp的政策和项目提供动力。GDP衡…

Springboot +Flowable,流程表单应用之外置表单(HTML形式)(一)

一.简介 整体上来说,我们可以将Flowable 的表单分为三种不同的类型: 动态表单 这种表单定义方式我们可以配置表单中每一个字段的可读性、可写性、是否必填等信息,不过不能定义完整的表单页面。外置表单 外置表单我们只需要定义一下表单的 k…

国考省考行测:求基期量,去年的量,增长率r小于6%化除为乘,否则直接相除

国考省考行测:求基期量,去年的量 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和…

AIGC产业研究报告2023——三维生成篇

定义 人工智能三维生成是指利用深度神经网络学习并生成物体或场景的三维模型,并在三维模型的基础上将色彩与光影赋予物体或场景使生成结果更加逼真。在应用中,生成物体或场景的三维模型称为三维建模,生成三维模型的色彩与光影称为三维渲染。…

在博客逮到一个阿里8年测试开发,聊过之后我悟了....

老话说的好,这人呐,一旦在某个领域鲜有敌手了,就会闲得疋虫疼。前几天我在上班摸鱼刷社区的时候认识了一位腾讯测试开发大佬,在阿里工作了8年,因为本人天赋比较高,平时工作也兢兢业业,现在企业内…

异常检测相关论文记录

1、Unsupervised anomaly detection algorithms on real-world data: how many do we need?真实世界数据的无监督异常检测算法:我们需要多少? Abstract: 将所考虑的算法在所有数据集上的相对性能进行可视化和聚类,我们确定了两个…

10分钟轻松实现三菱FX3UPLC连接阿里云平台

MQTT协议网关串口连接三菱FX3UPLC操作说明v1.3 目录 一. 使用流程 二. 准备工作 2.1 需要准备如下物品 2.2 LF220网关准备工作 2.3 PLC准备工作 2.4 电脑的准备工作 2.5 MQTT服务器准备工作 三. 阿里云IoT平台配置步骤 3.1 创建产品 3.2 添加设备 3.3 配…

pip下载包报错ERROR: No matching distribution found for xxx时的解决方案

前言 当我们使用python自带的pip安装一些包时,可能会报以下错误: 出现这种情况有三种可能: 第一种可能: pip的版本过低,需要升级一下,可以执行以下命令进行尝试 python -m pip install --upgrade pip第…

MySQL---存储函数、触发器

1. 存储函数 MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算 或功能写成一个函数。 存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。 存储函数与存储过程的区…

如何裁剪图片,裁剪图片的几个方法

如何裁剪图片,裁剪图片的几个方法你知道吗?在日常生活中,当浏览图片时,常会想要对某些图片进行裁剪,或从生活照片中裁剪自己的部分。如何处理这种情况?裁剪图片可去除图像不必要的部分,让其更美…

[日记]LeetCode算法·二十六——二叉树⑥ 红黑树(插入与删除,附图)

承接上一篇AVL树AVL树,红黑树相较于AVL树,就相当于完全二叉树相当于AVL树,如何在性能退化和维护成本之间做出CS中经典的trade-off 文章目录 红黑树的概念红黑树查询效率红黑树的插入1 插入节点N为根节点2 插入节点N的父节点P为黑色3 N的父节…

雷鸟Air Plus体验:视觉大幅升级,影视/办公/游戏全能胜任

雷鸟BirdBath系列XR眼镜一直保持着较快的迭代频率,如今迎来该系列第三款产品:雷鸟Air Plus,新品在视觉体验上得到大幅升级,不仅FOV达到49,边缘成像质量更高,搭配索尼旗舰级Micro OLED屏实现最高120Hz刷新率…

LoRa温振变送器的类型特点及技术参数

自电器文明开始,短短一个世纪,我们对科学探索已经从工业到达了智能化的程度。传感器的应用,不断为时代带来惊喜,各行各业都在争相抓紧契机,利用科技不断创新,推动着整个传感器行业的发展。在工业自动化系统…

redis单机版本Java代码实践

pom依赖 引入redis的starter以及commons-pool2的依赖&#xff0c;commons-pool2是配置连接池需要使用的&#xff0c;不引入&#xff0c;只有连接池配置是不会创建连接池的 <!-- redis --><dependency><groupId>org.springframework.boot</groupId><…

k8s的一些基本概念

目录 masterNodePod和ContainerControllerService和IngressLabelSecretVolumeReplicationController和ReplicaSetDeploymentDaemonSetJobCronJobStatefulSetNamespace 推荐k8s中文文档&#xff0c;里面有各种概念的具体用法http://docs.kubernetes.org.cn/437.html 一个k8s集群…

Spring Boot 整合MyBatis 和 Spring Boot 整合MyBatis-Plus

目录 Spring Boot 整合MyBatis 代码配置实现 创建数据库和表 使用灵活的方式创建maven 创建resources/application.yml &#xff0c;配置数据源参数, 并完成Spring Boot 项目启动测试 测试DruidDataSourceConfig 创建MonsterMapper接口 创建resources\mapper\MonsterMap…

开发笔记之:文件读取溢出分析(QT C++版)

&#xff08;1&#xff09;引言 以下是QT C读取数据文件&#xff08;QDataStream&#xff09;的代码&#xff1a; /*** 按双字读取* param fis 文件输入流* param isBigEndian 是否大头&#xff08;字节序&#xff09;* return 双字值*/ DWORD FsFileUtil::readAsD…

工欲善其事必先利其器——开发神器(IDEA)

&#x1f525;IDEA 简介&#x1f525;IDEA的特色功能&#x1f525;IDEA的优点&#x1f525;IDEA 的使用&#x1f525;IDEA的常用快捷键 &#x1f525;IDEA 简介 IDEA 全称 IntelliJ IDEA&#xff0c;是 java 编程语言开发的集成环境&#xff0c;被公认为最好的 java 开发工具之…