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

news2025/1/10 16:10:50

目录

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 声明交换机 队列 以及绑定路由键

    @Bean
    public DirectExchange pzyExchange() {
//        return new DirectExchange("pzy_exchange", true, false);
        return ExchangeBuilder.directExchange("pzy_exchange").build();
    }

    @Bean
    public Queue deadLetterQueue() {
        return QueueBuilder.durable("order_dead_queue").build();
    }

    @Bean
    public Binding deadBinding(Queue deadLetterQueue, DirectExchange pzyExchange) {
        return BindingBuilder.bind(deadLetterQueue).to(pzyExchange).with("orderDeadRoutingKey");
    }

    @Bean
    public Binding normalBinding(Queue normalLetterQueue, DirectExchange pzyExchange) {
        return BindingBuilder.bind(normalLetterQueue).to(pzyExchange).with("orderNormalRoutingKey");
    }

    @Bean
    public 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.coloradmin.cn/o/770684.html

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

相关文章

网络知识整合——Web页面请求的历程

Web页面请求的历程 内部涉及知识&#xff1a;一、准备:DHCP、UDP、IP 和以太网二、仍在准备&#xff1a;DNS和ARP三、仍在准备&#xff1a;域内路由选择到DNS服务器四、Web客户-服务器交互&#xff1a;TCP和HTTP五、HTTP请求响应格式Requests部分Responses 部分 下载一个Web页面…

【MySQL】_1.数据库基础

目录 1.数据库介绍 1.1 数据结构与数据库 1.2 常见的数据库软件 1.3 数据库的分类 1.4 MySQL介绍 1.4.1 重要概念 1.4.2 学习内容 1.4.3 数据库服务器在硬盘上组织数据的方式 2. 数据库操作 2.1 显示当前数据库 2.2 创建数据库 2.3 选中数据库 2.4 删除数据库 3…

在分区工具上,格式化分区和删除分区. 两者有什么不一样吗?

1.格式化分区&#xff1a;就是重建文件系统&#xff0c;等于把目标分区的数据全部清掉。 删除分区&#xff1a;你删除后可以再重新分区&#xff0c;可以分区多个分区&#xff0c;前提是“删除分区”的大小足够大。分了区&#xff0c;还必须格式化&#xff0c;才能用。 只有分了…

vue3+vite+pinia+vue-router搭建环境

前提&#xff1a;前面已经创建一个项目&#xff0c;涉及到vue3、vite、pinia、vue-router、openlayers创建的命令行及对应版本。接下来&#xff0c;是整个项目的详细配置。 详细配置&#xff0c;包括以下内容&#xff1a; 一、vue (一)、vue3&#xff0c;并且使用组合式API vue…

理解冯.诺依曼体系结构(操作系统和进程)

文章目录 一.冯诺依曼体系结构二.冯诺依曼体系结构与木桶效应三.操作系统与进程操作系统Linux系统中的进程 一.冯诺依曼体系结构 冯诺依曼体系结构特性: 冯诺依曼体系结构中的存储器指的是内存——一种硬件级别的缓存空间(介于IO设备与CPU之间,只有数据存储和读写功能,并且具有…

重排链表问题

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。…

基础语言模型LLaMA

LLaMA包含从7B到65B参数的基础语言模型集合。Meta在数万亿个tokens上训练了模型&#xff0c;LLaMA-13B在大多数基准测试中优于GPT-3&#xff08;175B&#xff09;。 来自&#xff1a;LLaMA: Open and Efficient Foundation Language Models 目录 背景概述方法预训练数据架构Op…

会员管理系统如何深度绑定用户?会员系统必备哪些功能?

在以消费者为主导的企业&#xff08;商家&#xff09;范围内&#xff0c;实行会员制管理能够更好的提升客户的忠诚度&#xff0c;减少客户的流失。完整、精确的会员管理系统&#xff0c;更能提升企业&#xff08;商家&#xff09;的实际效益。 蚓链会员管理系统(专业版) 便是这…

VMware扩展磁盘提示:在部分链上无法执行所调用的函数。请打开父虚拟磁盘

VMware扩展磁盘提示&#xff1a;在部分链上无法执行所调用的函数。请打开父虚拟磁盘 在为VMware中的虚拟机扩展磁盘时提示&#xff1a;在部分链上无法执行所调用的函数。请打开父虚拟磁盘。 出现这个问题是因为你先前创建过快照&#xff0c;但是快照删除时候&#xff0c;残余文…

JAVA集成国密SM3

JAVA集成国密SM3加密、验签 一、pom配置二、加密代码集成2.1、目录结构2.2、源码2.3、测试 三、验签代码集成2.1、目录结构2.2、源码2.3、测试 四、相关链接 国密算法概述&#xff1a;https://blog.csdn.net/qq_38254635/article/details/131801527 SM3杂凑算法 SM3 消息摘要。…

怎么学习Java数据库连接(JDBC)? - 易智编译EaseEditing

学习Java数据库连接&#xff08;JDBC&#xff09;是掌握Java与数据库交互的关键步骤。以下是学习Java JDBC的一些建议&#xff1a; 先掌握Java基础&#xff1a; 在学习JDBC之前&#xff0c;确保你已经掌握了Java的基本语法、面向对象编程和其他核心概念。这将有助于更好地理解…

干货分享:商城系统开发方式

商城系统是一种为了满足电子商务需求而开发的系统&#xff0c;它能够实现在线购物、支付、订单管理等功能。在当今互联网时代&#xff0c;商城系统的开发方式多种多样。那么&#xff0c;商城系统开发方式有哪些呢&#xff1f; 1、完全独立自主开发 完全独立自主开发是指企业根…

FactoryBean源码解析

文章目录 一、简介二、FactoryBean 接口的方法三、FactoryBean 与 BeanFactory 的区别四、源码解析五、实际应用 一、简介 FactoryBean 是 Spring 框架中的一个接口&#xff0c;用来创建特定类型的 Bean 对象。实现FactoryBean 接口就可以自定义 Bean 对象的创建过程。Factory…

深入浅出如何通过API瞬间搭建亿万商品外贸代购系统PHP系统

什么是淘宝代购 淘宝代购是近年兴起的一种购物模式&#xff0c;是帮国外客户购买中国商品。主要是通过万邦 科技的外贸代购系统&#xff0c;把淘宝、天猫等电商平台的全站商品通过API 接入到你的网站 上&#xff0c;瞬间就可以架设一个有数亿产品的大型网上商城&#xff0c;而…

【Leetcode】687.最长同值路径

一、题目 1、题目描述 给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示例1: 输入:root = [5,4,5,1,1,5] 输出:2示例2: 输入:root …

IT技术岗的面试技巧分享

我们在找工作时,需要结合自己的现状,针对意向企业做好充分准备。作为程序员,你有哪些面试IT技术岗的技巧?你可以从一下几个方向谈谈你的想法和观点。 方向一:分享你面试IT公司的小技巧 1、事先和邀约人了解公司的基本情况,比如公司的行业,规模,研发人员占比等 2、事先和…

甲板上的战舰(力扣)递归 JAVA

给你一个大小为 m x n 的矩阵 board 表示甲板&#xff0c;其中&#xff0c;每个单元格可以是一艘战舰 ‘X’ 或者是一个空位 ‘.’ &#xff0c;返回在甲板 board 上放置的 战舰 的数量。 战舰 只能水平或者垂直放置在 board 上。换句话说&#xff0c;战舰只能按 1 x k&#xf…

华为OD机试真题 Java 实现【最左侧冗余覆盖子串】【2023Q2 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、思路 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

C++-----vector

本期我们来学习C中的vector&#xff0c;因为有string的基础&#xff0c;所以我们会讲解的快一点 目录 vector介绍 vector常用接口 构造函数 sort 迭代器 size&#xff0c;max_size&#xff0c;capacity&#xff0c;empty reserve和resize front和back data insert和…

VUE- 选取本地图片,自定义裁切图片比例 vue-cropper

裁切图片&#xff0c;按照比例裁切&#xff0c;分步骤 1&#xff1a;el-upload选择本地图片&#xff08;分选择本地和上传两步骤&#xff09; 2&#xff1a;在on-change回调方法中拿到el-upload选中的图片&#xff0c;显示在vueCropper上&#xff08;&#xff09;。 2.1&…