微服务: 05-rabbitmq设置重试次数并设置死信队列

目录

1. 上文传送门: 

2. 前言简介: 

2.1 问: 消费端重复循环异常如何解决?

2.2 为什么要使用死信队列

2.3 案例思路

-> ps: 以下案例经过测试(思路一/二实现原理一样)

-> 2.3.1 思路一 

-> 2.3.2 思路二

3. 案例代码

3.1 简单介绍案例

3.2 声明交换机 队列 以及绑定路由键

3.3 修改配置文件

3.4 发送消息

 3.5 接收消息(自动确认)

3.6 开启测试代码

3.7 测试结果

---> 3.7.1 查看交换机

 ---> 3.7.2 查看队列​编辑

 ---> 3.7.3 主要查看方向

---> 3.7.4 另外遇到问题 别慌


1. 上文传送门: 

微服务: 00-rabbitmq出现的异常以及解决方案

微服务: 01-rabbitmq的应用场景及安装(docker)

微服务: 02-rabbitmq在springboot中如何使用(上篇)

微服务: 03-rabbitmq在springboot中如何使用(下篇)

微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式

2. 前言简介: 

上面文章是安装, 基础测试案例, 下面是进阶的第一篇文章

本篇主要介绍自动确认进入死信队列
手动确认在下一篇介绍

2.1 问: 消费端重复循环异常如何解决?

使用 RabbitMQ 的重试机制,当消费者处理消息失败时,可以将消息重新放回队列中,并设置一定的重试次数和重试时间间隔。如果超过了重试次数仍然处理失败,则可以将消息放入死信队列中,方便后续处理

2.2 为什么要使用死信队列

无法被消费的消息, 这样的消息如果没有后续的处理,就会一直在正常队列里重复重试, 所以加入私信队列后 进行人工补偿, 也可以分等级 哪些重要消息需要优先处理

2.3 案例思路

-> ps: 以下案例经过测试(思路一/二实现原理一样)

-> 2.3.1 思路一 

 两个交换机(一个正常exchange 一个死信exchange)

 两个队列(正常queue,死信queue) 一个队列一个路由键

 正常交换机绑定正常queue 绑定路由键 同理

-> 2.3.2 思路二

一个交换机  两个不同路由键 然后绑定(本文使用)


3. 案例代码

3.1 简单介绍案例

服务A发起请求到 rabbitmq,  服务B监听并处理消息, 报错了, 重试了五次还不行后 , 进入死信队列

3.2 声明交换机 队列 以及绑定路由键

    @Beanpublic DirectExchange pzyExchange() {
//        return new DirectExchange("pzy_exchange", true, false);return ExchangeBuilder.directExchange("pzy_exchange").build();}@Beanpublic Queue deadLetterQueue() {return QueueBuilder.durable("order_dead_queue").build();}@Beanpublic Binding deadBinding(Queue deadLetterQueue, DirectExchange pzyExchange) {return BindingBuilder.bind(deadLetterQueue).to(pzyExchange).with("orderDeadRoutingKey");}@Beanpublic Binding normalBinding(Queue normalLetterQueue, DirectExchange pzyExchange) {return BindingBuilder.bind(normalLetterQueue).to(pzyExchange).with("orderNormalRoutingKey");}@Beanpublic Queue normalLetterQueue() {Map<String, Object> arguments = new HashMap<>(3);arguments.put("x-dead-letter-exchange", "pzy_exchange");arguments.put("x-dead-letter-routing-key", "orderDeadRoutingKey");arguments.put("x-max-length", 200);return QueueBuilder.durable("order_normal_queue").withArguments(arguments).build();}

3.3 修改配置文件

微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式

3.4 发送消息

rabbitTemplate.convertAndSend("pzy_exchange", "orderNormalRoutingKey", "我是消息");

 3.5 接收消息(自动确认)

自动确认, 在重试结束后, 自动进入死信队列

(手动确认的下文在介绍)

@RabbitListener(queues = "#{normalLetterQueue.name}")public void oldHoldInNewPurchaseData(Message message, String message1, Channel channel) throws IOException {log.info("获取到mq消息,消息内容为{}", message);log.info("mq接收到的对象===>{}", aixiPurchaseRequestDTO);
//        System.out.println(map);try {//            int i = new Random().nextInt(5);//            if (i > 1) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//60% 概率报错
//            if (true) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//100% 报错//            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {e.printStackTrace();log.error("异常===> {}", e.getMessage());throw new OrderServiceException(ResponseEnum.E40008, e.getMessage());} finally {
//            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);}}

3.6 开启测试代码

第一个判断(60%): 是查看是否在第一次报错后续消费成功后 是否进入死信队列

第二个判断(100%): 是测试重试机制(次数)过后 是否进入死信队列

抛出 throw new RuntimeException("测试报错!") 就可以

int i = new Random().nextInt(5);
if (i > 1) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//五分之三概率报错
//if (true) throw new OrderServiceException(ResponseEnum.E40008, "后端测试报错回收机制!");//五分之三概率报错

3.7 测试结果

---> 3.7.1 查看交换机

有没有绑定两个路由键(没有查看绑定配置)

 ---> 3.7.2 查看队列

 ---> 3.7.3 主要查看方向

查看是不是最后一次报错后 才进入死信队列

报错异常是不是无限制循环报错

---> 3.7.4 另外遇到问题 别慌

先把交换机和队列都删了 然后再重试

[如果生产者和消费者配置是独立的 看看队列声明时是否相同, 不同删了队列重启项目]


 

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

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

相关文章

Redis实战案例19-Redis解决主从一致性问题

主节点&#xff08;Master&#xff09;“写操作”&#xff1a; 接收并响应客户端的读写请求。持久化数据到磁盘&#xff08;根据配置可以选择使用RDB快照或者AOF日志&#xff09;。将自己的写操作同步给所有的从节点。处理发布/订阅&#xff08;Pub/Sub&#xff09;模式中的发…

ARM 架构是什么?

ARM&#xff08;Advanced RISC Machines&#xff09;架构是一种处理器架构&#xff0c;它是一种精简指令集计算机&#xff08;RISC&#xff09;架构。ARM架构最初由ARM Holdings&#xff08;现在是SoftBank Group的子公司&#xff09;开发&#xff0c;并在1980年代末和1990年代…

安卓APK反编译+修改+重打包+签名

目录 1.下载反编译工具包。2.将APK包&#xff0c;重命名为ZIP&#xff0c;解压。放到反编译根目录下。3.使用apktool反编译修改smail文件&#xff0c;进行重打包4.重新打包5.重签名 1.下载反编译工具包。 反编译工具包地址&#xff1a;百度网盘 提取码&#xff1a;dsu3 解压后…

AtcoderABC243场

A - Shampoo A - Shampoo ] 题目大意 高桥家有三个人&#xff1a;高桥、他的父亲和他的母亲。每个人每晚都在浴室洗头发。他们按照顺序使用AA、BB和CC毫升的洗发水。 问&#xff0c;今天早上瓶子里有VV毫升的洗发水。在不重新装满的情况下&#xff0c;谁会第一个用完洗发水洗头…

网工内推 | 美图秀秀招网工,大专以上,15薪,NP认证优先

01 美图公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、美图大厦网络、分公司网络、IT相关项目的网络、办公内网服务器&#xff1b; 2、负责网络的设计、运行、管理和维护等工作&#xff1b; 3、负责远程办公环境的优化、运行、管理和维护工作&#xff1b; 4、…

为什么低代码只能掀起小浪花?了解低代码的得失与前景

导语&#xff1a;低代码是相对于高代码和无代码的一个中间概念&#xff0c;通常强调的是用户不需要学习如何写代码&#xff0c;就能完成工作。然而低代码模式一直不温不火&#xff0c;原因是什么呢&#xff1f;一起来看一下吧。 最近互联网大公司裁员消息又起&#xff0c;“低代…

Linux: cannot read file data

报错&#xff1a; Could not load library libcudnn_cnn_infer.so.8. Error: /home/qc/miniconda3/envs/DNAqc/lib/python3.10/site-packages/torch/lib/libcudnn_cnn_infer.so.8: cannot read file data Please make sure libcudnn_cnn_infer.so.8 is in your library path! A…

【NLP】国外新动态--LLM模型

一、说明 NLP走势如何?这是关于在实践中使用大型语言模型(LLM)的系列文章中的一篇文章。在这里,我将介绍LLM,并介绍使用它们的3个级别。未来的文章将探讨LLM的实际方面,例如如何使用OpenAI的公共API,Hugging Face Transformers Python库,如何微调LLM,以及如何从头开始…

navicate_windows_14

1.新建文本文档2.输入如下内容 echo off set dnInfo set dn2ShellFolder set rpHKEY_CURRENT_USER\Software\Classes\CLSID :: reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration14XCS /f %针对<strong><font color"#FF0000"…

华为产品测评官-开发者之声 - ModelArts 真实体验感想

华为产品测评官&#xff0d;开发者之声 - ModelArts 真实体验感想 我先是在6月17日参加了华为在深圳举办的开发者大会&#xff0c;后面看到群里发的"2023华为产品测评官&#xff0d;开发者之声"活动&#xff0c;简单看了一下体验活动的具体事情&#xff0c;感觉好玩…

【005】基于深度学习的图像语 通信系统

摘要 语义通信是一种新颖的通信方式&#xff0c;可通过传输数据的语义信息提高带宽效率。提出一种用于无线图像传输的系统。该系统基于深度学习技术开发并以端到端&#xff08;E2E&#xff09;的方式进行训练。利用深度学习实现语义特征的提取和重建&#xff0c;在发送端提取信…

异步fifo(1)

什么时异步fifo FIFO&#xff0c;即First In First Out &#xff0c;是一种先进先出的数据缓存器&#xff0c;异步FIFO 是指读写时钟不一致&#xff0c;读写时钟是互相独立的。数据从一个时钟域写入FIFO缓冲区&#xff0c;并从另一个时钟域的同一FIFO缓冲区中读取数据&#xf…

CSS 伪元素: ::marker 自定义列表序号

::marker 伪元素 ::marker&#xff0c;可作用在任何设置了 display: list-item 的元素或伪元素上&#xff0c;例如<li>和<summary>。 /** <ul><li>Peaches</li><li>Apples</li><li>Plums</li> </ul> */ ul li::…

uni-app做h5IOS底部tabbar高度在不同的tabbar页面会忽高忽低

原因不祥&#xff0c;解决办法的话在App.vue中 <style langscss> //每个页面公共css page { height:100vh; } </style>

【hadoop】HDFS

HDFS 操作HDFSWeb Console 网页工具操作NameNode操作SecondaryNameNode 命令行Java API HDFS的原理解析数据上传的过程数据下载的过程 HDFS的高级特性回收站配额Quota名称配额空间配额 快照Snapshot安全模式 SafeMode权限管理&#xff1a;类似LinuxHDFS的集群 HDFS的底层原理&a…

软件测试行业的困境和迷局

中国的软件测试虽然起点较高&#xff0c;但是软件测试的发展似乎没有想象中那么顺利。 其实每个行业除了有自身领域外&#xff0c;还有属于自己的“生态系统”。属于软件测试的生态系统主要包括后备软件测试人员、软件开发人员和软件管理决策者。后备软件测试人员是软件测试的…

微服务保护——Sentinel【实战篇】

一、限流规则&#x1f349; 1.簇点链路&#x1f95d; 簇点链路&#xff1a;就是项目内的调用链路&#xff0c;链路中被监控的每个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点&#xff08;Endpoint&#xff09;&#xff0c;因此SpringMVC的每一个端点&a…

excel文件导入或导出Java代码示例

1、excel文件导入 controller层接口内容 service层代码 serviceImpl内代码内容 OverrideTransactional(rollbackFor Exception.class)public void importCheckItemExcel(MultipartFile file, Long checkPkgId) throws Exception {if (file.isEmpty()){throw new IOException(…

Java 中 synchronized 的优化操作:锁升级、锁消除、锁粗化

由 并发编程中常见的锁策略 总结可知&#xff0c;synchronized 具有以下几个特性&#xff1a; 开始时是乐观锁&#xff0c;如果锁冲突频繁&#xff0c;就转换为悲观锁。开始是轻量级锁实现&#xff0c;如果锁被持有的时间较长&#xff0c;就转换成重量级锁。实现轻量级锁时&am…

Spring Cloud Alibaba【Nacos配置动态刷新、Nacos集群架构介绍 、Nacos的数据持久化、认识分布式流量防护 】(五)

目录 分布式配置中心_Nacos配置动态刷新 分布式配置中心_Dubbo服务对接分布式配置中心 分布式配置中心_Nacos集群架构介绍 分布式配置中心_Nacos的数据持久化 分布式配置中心_Nacos集群配置 分布式流量防护_认识分布式流量防护 分布式流量防护_认识Sentinel 分布式配置…