RabbitMQ-死信队列常见用法
目录
一、什么是死信
二、什么是死信队列
编辑 三、第一种情景:消息被拒绝时
四、第二种场景:. 消费者发生异常,超过重试次数 。 其实spring框架调用的就是 basicNack
五、第三种场景: 消息的Expiration 过期时长或队列TTL过期时间。
六、 第四种情景: 消息队列达到最大容量
一、什么是死信
在RabbitMQ 中充当主角的就是消息,在不同场景下,消息会有不同地表现。
死信就是消息在特定场景下的一种表现形式,这些场景包括:
1. 消息被拒绝访问,即 RabbitMQ返回 basicNack 的信号时 或者拒绝basicReject
2. 消费者发生异常,超过重试次数 。 其实spring框架调用的就是 basicNack
3. 消息的Expiration 过期时长或队列TTL过期时间。
4. 消息队列达到最大容量
上述场景经常产生死信,即消息在这些场景中时,被称为死信。
二、什么是死信队列
死信队列就是用于储存死信的消息队列,在死信队列中,有且只有死信构成,不会存在其余类型的消息。
死信队列在 RabbitMQ 中并不会单独存在,往往死信队列都会绑定这一个普通的业务消息队列,当所绑定的消息队列中,有消息变成死信了,那么这个消息就会重新被交换机路由到指定的死信队列中去,我们可以通过对这个死信队列进行监听,从而手动的去对这一消息进行补偿。 人工干预
三、第一种情景:消息被拒绝时
#设置消费者手动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = manual
package com.by.consumer;import com.by.model.OrderingOk;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;@Configuration
@Slf4j
public class DeadConsumer {//死信交换机@Beanpublic DirectExchange deadExchange() {return ExchangeBuilder.directExchange("Dead_E01").build();}//死信队列@Beanpublic Queue deadQueue1() {return QueueBuilder.durable("Dead_Q01").build();}//死信交换机与死信队列的绑定@Beanpublic Binding deadBinding1(Queue deadQueue1, DirectExchange deadExchange) {return BindingBuilder.bind(deadQueue1).to(deadExchange).with("RK_DEAD");}//业务队列@Beanpublic Queue queue1() {return QueueBuilder.durable("Direct_Q01").deadLetterExchange("Dead_E01").deadLetterRoutingKey("RK_DEAD")//.ttl(10*1000) //该属性是队列的属性,设置消息的过期时间,消息在队列里面停留时间n毫秒后,就会把这个消息投递到死信交换机,针对的是所有的消息//.maxLength(20) //设置队列存放消息的最大个数,x-max-length属性值,当队列里面消息超过20,会把队列之前的消息依次放进死信队列.build();}//业务交换机@Beanpublic DirectExchange exchange() {return ExchangeBuilder.directExchange("Direct_E01").build();}//业务交换机与队列的绑定@Beanpublic Binding binding1(Queue queue1, DirectExchange exchange) {return BindingBuilder.bind(queue1).to(exchange).with("RK01");}//@RabbitListener(queues = "Direct_Q01")
// public void receiveMessage(OrderingOk msg) {
// log.info("消费者1 收到消息:"+ msg );
// int i= 5/0;
// }@RabbitListener(queues = "Direct_Q01")public void receiveMessage(OrderingOk msg, Message message, Channel channel) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.println("消费者1 收到消息:" + msg + " tag:" + deliveryTag);channel.basicReject(deliveryTag, false);
// try {
// // 处理消息...
// int i= 5/0;
// // 如果处理成功,手动发送ack确认 ,Yes
// channel.basicAck(deliveryTag, false);
// } catch (Exception e) {
// // 处理失败,可以选择重试或拒绝消息(basicNack或basicReject) NO
// channel.basicNack(deliveryTag, false, false); // 并重新入队
//
// }}
}


四、第二种场景:. 消费者发生异常,超过重试次数 。 其实spring框架调用的就是 basicNack
一般要和自动重启一起使用,否则死信队列收不到消息
#设置消费者自动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = auto
#开启自动应答重试机制
spring.rabbitmq.listener.simple.retry.enabled=true
package com.by.consumer;import com.by.model.OrderingOk;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;@Configuration
@Slf4j
public class DeadConsumer {//死信交换机@Beanpublic DirectExchange deadExchange() {return ExchangeBuilder.directExchange("Dead_E01").build();}//死信队列@Beanpublic Queue deadQueue1() {return QueueBuilder.durable("Dead_Q01").build();}//死信交换机与死信队列的绑定@Beanpublic Binding deadBinding1(Queue deadQueue1, DirectExchange deadExchange) {return BindingBuilder.bind(deadQueue1).to(deadExchange).with("RK_DEAD");}//业务队列@Beanpublic Queue queue1() {return QueueBuilder.durable("Direct_Q01").deadLetterExchange("Dead_E01").deadLetterRoutingKey("RK_DEAD")//.ttl(10*1000) //该属性是队列的属性,设置消息的过期时间,消息在队列里面停留时间n毫秒后,就会把这个消息投递到死信交换机,针对的是所有的消息//.maxLength(20) //设置队列存放消息的最大个数,x-max-length属性值,当队列里面消息超过20,会把队列之前的消息依次放进死信队列.build();}//业务交换机@Beanpublic DirectExchange exchange() {return ExchangeBuilder.directExchange("Direct_E01").build();}//业务交换机与队列的绑定@Beanpublic Binding binding1(Queue queue1, DirectExchange exchange) {return BindingBuilder.bind(queue1).to(exchange).with("RK01");}//@RabbitListener(queues = "Direct_Q01")
// public void receiveMessage(OrderingOk msg) {
// log.info("消费者1 收到消息:"+ msg );
// int i= 5/0;
// }@RabbitListener(queues = "Direct_Q01")public void receiveMessage(OrderingOk msg, Message message, Channel channel) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.println("消费者1 收到消息:" + msg + " tag:" + deliveryTag);int a=10/0;
// channel.basicReject(deliveryTag, false);
// try {
// // 处理消息...
// int i= 5/0;
// // 如果处理成功,手动发送ack确认 ,Yes
// channel.basicAck(deliveryTag, false);
// } catch (Exception e) {
// // 处理失败,可以选择重试或拒绝消息(basicNack或basicReject) NO
// channel.basicNack(deliveryTag, false, false); // 并重新入队
//
// }}
}


五、第三种场景: 消息的Expiration 过期时长或队列TTL过期时间。
//业务队列@Beanpublic Queue queue1() {return QueueBuilder.durable("Direct_Q01").deadLetterExchange("Dead_E01").deadLetterRoutingKey("RK_DEAD").ttl(10*1000) //该属性是队列的属性,设置消息的过期时间,消息在队列里面停留时间n毫秒后,就会把这个消息投递到死信交换机,针对的是所有的消息//.maxLength(20) //设置队列存放消息的最大个数,x-max-length属性值,当队列里面消息超过20,会把队列之前的消息依次放进死信队列.build();}

六、 第四种情景: 消息队列达到最大容量
//业务队列@Beanpublic Queue queue1() {return QueueBuilder.durable("Direct_Q01").deadLetterExchange("Dead_E01").deadLetterRoutingKey("RK_DEAD")
// .ttl(10*1000) //该属性是队列的属性,设置消息的过期时间,消息在队列里面停留时间n毫秒后,就会把这个消息投递到死信交换机,针对的是所有的消息.maxLength(5) //设置队列存放消息的最大个数,x-max-length属性值,当队列里面消息超过5,会把队列之前的消息依次放进死信队列.build();}
/*** 测试直联交换机** @throws IOException* @throws InterruptedException*/@Testvoid contextLoads() throws IOException, InterruptedException {for (int i = 0; i < 8; i++) {OrderingOk orderingOk = OrderingOk.builder().id(1).name("张三"+i).build();directProvide.send(orderingOk);}System.in.read();}
id为1,2,3的被装进了死信队列,因为数据太老,业务队列优先要新的数据

相关文章:
RabbitMQ-死信队列常见用法
目录 一、什么是死信 二、什么是死信队列 编辑 三、第一种情景:消息被拒绝时 四、第二种场景:. 消费者发生异常,超过重试次数 。 其实spring框架调用的就是 basicNack 五、第三种场景: 消息的Expiration 过期时长或队列TTL…...
2024/4/14周报
文章目录 摘要Abstract文献阅读题目创新点CROSSFORMER架构跨尺度嵌入层(CEL)CROSSFORMER BLOCK长短距离注意(LSDA)动态位置偏置(DPB) 实验 深度学习CrossFormer背景维度分段嵌入(DSW)…...
MySQL 社区版 安装总结
很早就安装过MySQL,没有遇到过什么问题,直接next就行了,这次在新电脑上安装却遇到了一些问题,记录一下。 安装的是MySQL社区版,下载地址是www.mysql.com,进入后选择DOWNLOAD页面,选择MySQL Com…...
二叉排序树的增删改查(java版)
文章目录 1. 基本节点2. 二叉排序树2.1 增加节点2.2 查找(就是遍历)就一起写了吧2.3 广度优先遍历2.4 删除(这个有点意思)2.5 测试样例 最后的删除,目前我测试的是正确的 1. 基本节点 TreeNode: class TreeNode{pri…...
linux下coredump问题的定位分析方法
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 参考:https://blog.csdn.net/m0_73698480/article/details/130077852 最近定位了一段时间linux下的崩溃问题,又收集了一些思路,特整理记录一下。 常见coredump定位方法是:…...
第十届蓝桥杯省赛真题(C/C++大学B组)
目录 试题 A: 组队 试题 B: 年号字串 试题 C: 数列求值 试题 D: 数的分解 试题 E: 迷宫 试题 F: 特别数的和 试题 G:完全二叉树的权值 试题 H:等差数列 试题 I:后缀表达式(不一定对) 试题 J:灵能…...
Scrapy 爬取m3u8视频
Scrapy 爬取m3u8视频 【一】效果展示 爬取ts文件样式 合成的MP4文件 【二】分析m3u8文件路径 视频地址:[在线播放我独自升级 第03集 - 高清资源](https://www.physkan.com/ph/175552-8-3.html) 【1】找到m3u8文件 这里任务目标很明确 就是找m3u8文件 打开浏览器…...
LVGL简单记录
1、 vs中代码旁边有个小锁删除git 2、Visual Studio 试图编译已删除的文件, 如果这个文件也是你不再需要编译的文件,且已经从文件系统中删除,你需要从 .vcxproj 文件中移除或者注释掉这一行,以停止Visual Studio尝试去编译一个不…...
计算机网络——ARP协议
前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。 可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。 …...
【C++]C/C++的内存管理
这篇博客将会带着大家解决以下几个问题 1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 1. C/C内存分布 我们先来看下面的一段代码和相关问题 int global…...
深入理解计算机网络分层结构
一、 为什么要分层? 计算机网络分层的主要目的是将复杂的网络通信过程分解为多个相互独立的层次,每个层次负责特定的功能。这样做有以下几个好处: 模块化设计:每个层次都有清晰定义的功能和接口,使得网络系统更易于设…...
亚马逊云科技CTO带你学习云计算降本增效秘诀
2023亚马逊云科技一年一度的重磅春晚--Re:invent上有诸多不同话题的主题Keynote,这次小李哥带大家复盘来自亚马逊CTO: Wener博士的主题演讲: 云架构节俭之道1️⃣节俭对于云计算为什么重要? ▶️企业基础设施投入大,利用好降本策略可以减少巨…...
快速上手Vue
目录 概念 创建实例 插值表达式 Vue响应式特性 概念 Vue是一个用于 构建用户界面 的 渐进式 框架 构建用户界面:基于数据渲染出用户看到的页面 渐进式:Vue相关生态:声明式渲染<组件系统<客户端路由<大规模状态管理<构建工具 V…...
java 目录整理
Java知识相关目录主要参考黑马程序员 风清扬老师的视屏,参考链接为 Java_黑马刘意(风清扬)2019最新版_Java入门视频_Java入门_Java编程_Java入门教程_黑马教程_黑马程序员_idea版_哔哩哔哩_bilibili 1、java 基础 java基本认识?java跨平台原理?jdk、jre、jvm的联系? 链接:…...
使用Python的Pillow库进行图像处理书法参赛作品
介绍: 在计算机视觉和图像处理领域,Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具,使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件,并对选中的图像进行调整和…...
docker 容器指定utf-8编码
在运行 Docker 容器的时候,如果容器内应用需要使用 UTF-8 编码来正常处理中文,你可以通过设置环境变量来指定编码。 可以使用 -e 或者 --env 标志来设置环境变量。比如,设置 LANG 和 LC_ALL 环境变量为 C.UTF-8 或者 en_US.UTF-8:…...
单例模式以及常见的两种实现模式
单例模式是校招中最常考的设计模式之一. 设计模式其实就是类似于“规章制度”,按照这个套路来进行操作。 单例模式能保证某个类在程序中只存在唯一 一份实例。而不会创建出多个实例,如果创建出了多个实例,就会编译报错。而不会创建出多个实…...
Java hashCode() 和 equals()的若干问题解答
Java hashCode() 和 equals()的若干问题解答 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equals() 之间有什么联系? …...
高级IO——React服务器简单实现
3.4Reactor服务器实现 1.connect封装 每一个连接都要有一个文件描述符和输入输出缓冲区,还有读、写、异常处理的回调方法; 还包括指向服务器的回指指针; class connection; class tcpserver;using func_t std::function<void(s…...
Qt使用插件QPluginLoader 机制开发
简介: 插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循一定规范的应用程序接口编写出来的程序。 Qt 提供了2种APIs来创建插件: 一种高级API,用于为Qt本身编写插件:自定义数据库驱动程序,图像格…...
HybridCLR Generate All报错终极解决指南:UnityLinker.exe找不到HotUpdate.dll怎么办?
HybridCLR Generate All报错终极解决指南:UnityLinker.exe找不到HotUpdate.dll怎么办? 当你正在使用HybridCLR进行Unity热更新开发时,突然遇到Generate All报错,提示UnityLinker.exe无法解析HotUpdate.dll,这确实会让人…...
PDF24 Creator离线版隐藏技巧:5个连官网都没说的自动化妙用
PDF24 Creator离线版隐藏技巧:5个连官网都没说的自动化妙用 如果你经常需要处理PDF文档,可能已经听说过PDF24 Creator这款免费工具。但大多数人仅仅停留在基础功能的使用上,比如简单的PDF合并、分割或转换。今天我要分享的是PDF24 Creator离线…...
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现
OpenClaw硬件选购指南:百川2-13B-4bits量化版在不同GPU上的表现 1. 为什么需要关注硬件配置 去年冬天,当我第一次尝试在本地部署OpenClaw对接百川2-13B模型时,我的旧显卡GTX 1660 Ti直接崩溃了。那次经历让我深刻认识到——选择合适的硬件对…...
低功耗电源开关电路设计与MCU控制实现
1. 经典电源开关电路设计与分析1.1 系统架构概述该电源开关电路采用三级晶体管控制架构,实现以下核心功能:低功耗待机模式(静态电流<10μA)按键触发启动机制MCU控制的自锁功能软件可控的电源关断系统工作电压为9V输入ÿ…...
RTX4090D显存优化:OpenClaw+Qwen3-32B-Chat批量处理千页PDF
RTX4090D显存优化:OpenClawQwen3-32B-Chat批量处理千页PDF 1. 为什么需要显存优化 当我第一次尝试用OpenClaw对接Qwen3-32B-Chat处理PDF文档时,遇到了一个棘手的问题——显存爆炸。当时只是处理一个200页的PDF,显存占用就飙到了22GB&#x…...
ssm+java2026年毕设司库管理系统【源码+论文】
本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于企业理财与融资管理问题的研究,现有研究主要以大型企业ERP系统或通用财务管理软件为主,专门针对中…...
别再花钱买云API了!手把手教你用Docker+Ollama在本地免费跑通Strix渗透测试
零成本打造企业级渗透测试环境:DockerOllama本地化实战指南 当安全团队每月收到云服务商五位数的API账单时,当关键测试任务因网络抖动被迫中断时,越来越多的技术决策者开始重新审视渗透测试的基础架构。本文将揭示如何用消费级硬件构建媲美商…...
Edge浏览器专属:B站直播实时字幕插件开发全记录(附源码下载)
Edge浏览器实现B站直播实时字幕的技术解析与实战 作为一名长期关注Web语音技术的开发者,我最近在Edge浏览器上成功实现了一个B站直播实时字幕插件。这个项目的核心价值在于解决了无字幕直播场景下的信息获取难题——根据用户反馈,超过68%的观众会在没有字…...
【AI+教育】AI总犯“金鱼记忆”?揭秘大模型长期记忆架构,让它真正记住你!
在和AI对话时,你是否有过这样的抓狂时刻:前脚刚告诉它“我叫小明,我不吃香蕉”,五分钟后它又热情地向你推荐香蕉饼? 目前的多数大语言模型就像拥有“金鱼记忆”,一刷新就忘得一干二净。为了让智能体(Agent)能像真正的老朋友一样懂你,我们设计了一套长期记忆功能模块。…...
PLCopen运动控制功能块实战:从单轴控制到多轴联动的5个经典案例解析
PLCopen运动控制功能块实战:从单轴控制到多轴联动的5个经典案例解析 在工业自动化领域,精确的运动控制是实现高效生产的关键。无论是简单的传送带定位,还是复杂的多轴协同作业,PLCopen规范提供的标准化功能块都能为工程师提供强大…...
