RabbitMQ高级特性--重试特性

目录

1.重试配置

2.配置交换机&队列

3.发送消息

4.消费消息

5. 运行程序观察结果

6. 手动确认

 注意:


在消息传递过程中, 可能会遇到各种问题, 如网络故障, 服务不可用, 资源不足等, 这些问题可能导致消息处理失败. 为了解决这些问题, RabbitMQ 提供了重试机制, 允许消息在处理失败后重新发送.
但如果是程序逻辑引起的错误, 那么多次重试也是没有用的, 可以设置重试次数

1.重试配置

spring:rabbitmq:addresses: amqp://study:study@你的服务器IP:15673/你的虚拟机名listener:simple:acknowledge-mode: auto #消息接收确认retry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时⻓为5秒max-attempts: 5 # 最⼤重试次数(包括自身消费的一次)

2.配置交换机&队列

//重试机制
public static final String RETRY_QUEUE = "retry_queue";
public static final String RETRY_EXCHANGE_NAME = "retry_exchange";/重试机制 发布订阅模式
//1. 交换机
@Bean("retryExchange")
public Exchange retryExchange() {return
ExchangeBuilder.fanoutExchange(Constant.RETRY_EXCHANGE_NAME).durable(true).build();
}
//2. 队列
@Bean("retryQueue")
public Queue retryQueue() {return QueueBuilder.durable(Constant.RETRY_QUEUE).build();
}
//3. 队列和交换机绑定 Binding
@Bean("retryBinding")
public Binding retryBinding(@Qualifier("retryExchange") FanoutExchange 
exchange, @Qualifier("retryQueue") Queue queue) {return BindingBuilder.bind(queue).to(exchange);
}

3.发送消息

@RequestMapping("/retry")
public String retry(){rabbitTemplate.convertAndSend(Constant.RETRY_EXCHANGE_NAME, "", "retry 
test...");return "发送成功!";
}

4.消费消息

@Component
public class RetryQueueListener {//指定监听队列的名称@RabbitListener(queues = Constant.RETRY_QUEUE)public void ListenerQueue(Message message) throws Exception {System.out.printf("接收到消息: %s, deliveryTag: %d%n", new
String(message.getBody(),"UTF-8"), 
message.getMessageProperties().getDeliveryTag());//模拟处理失败try {int num = 3/0;System.out.println("处理完成");
}catch (Exception e){System.out.println("处理失败");
}}
}

5. 运行程序观察结果

接收到消息: consumer ack test..., deliveryTag: 1
处理失败

6. 手动确认

@RabbitListener(queues = Constant.RETRY_QUEUE)
public void ListenerQueue(Message message, Channel channel) throws Exception {long deliveryTag = message.getMessageProperties().getDeliveryTag();try {System.out.printf("接收到消息: %s, deliveryTag: %d%n", new
String(message.getBody(),"UTF-8"), 
message.getMessageProperties().getDeliveryTag());//模拟处理失败int num = 3/0;System.out.println("处理完成");//3. ⼿动签收channel.basicAck(deliveryTag, true);}catch (Exception e){//4. 异常了就拒绝签收Thread.sleep(1000);//第三个参数requeue, 是否重新发送, 如果为true, 则会重新发送,,若为false, 则直接
丢弃channel.basicNack(deliveryTag, true,true);}
}

运行结果:

接收到消息: retry test..., deliveryTag: 1
接收到消息: retry test..., deliveryTag: 2
接收到消息: retry test..., deliveryTag: 3
接收到消息: retry test..., deliveryTag: 4
接收到消息: retry test..., deliveryTag: 5
接收到消息: retry test..., deliveryTag: 6
接收到消息: retry test..., deliveryTag: 7
接收到消息: retry test..., deliveryTag: 8
接收到消息: retry test..., deliveryTag: 9
接收到消息: retry test..., deliveryTag: 10
接收到消息: retry test..., deliveryTag: 11

可以看到, 手动确认模式时, 重试次数的限制不会像在自动确认模式下那样直接生效, 因为是否重试以及何时重试更多地取决于应用程序的逻辑和消费者的实现.

自动确认模式下, RabbitMQ 会在消息被投递给消费者后自动确认消息. 如果消费者处理消息时抛出异常, RabbitMQ 根据配置的重试参数自动将消息重新⼊队, 从而实现重试. 重试次数和重试间隔等参数可以直接在RabbitMQ的配置中设定,并且RabbitMQ会负责执行这些重试策略.

手动确认模式下, 消费者需要显式地对消息进行确认. 如果消费者在处理消息时遇到异常, 可以选择不确认消息使消息可以重新⼊队. 重试的控制权在于应用程序本身, 而不是RabbitMQ的内部机制. 应用程序可以通过自己的逻辑和利用RabbitMQ的高级特性来实现有效的重试策略

 注意:

1. 动确认模式下: 程序逻辑异常, 多次重试还是失败, 消息就会被自动确认, 那么消息就丢失
2. 手 动确认模式下: 程序逻辑异常, 多次重试消息依然处理失败, 无法被确认, 就⼀直是
unacked的状态, 导致消息积压

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

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

相关文章

Vue 组件通信 - 中央事件总线

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue组件通信 - 中央事件总线 目录 中央事件总线 图示 准备工作 设置页面元素 创建组件 总结 中央事件总线 使用vue的监听和触发来实现中央事件总线方式。 on监听 emit触发,组件按钮绑定点击事件&#xff0c…

5.0 WPF的基础介绍1-Grid,Stack,button

WPF: Window Presentation Foundation. WPF与WinForms的对比如下: 特性WinFormsWPF技术基础基于传统的GDI(图形设备接口)基于DirectX,支持硬件加速的矢量渲染UI设计方式拖拽控件事件驱动代码(简单但局限)…

QT软件设计可考虑回答

在Qt应用中是否引入抽象类需要根据具体场景权衡&#xff0c;以下是分层建议&#xff1a; 建议采用抽象类的3个典型场景&#xff1a; 传感器系统抽象&#xff08;强推荐&#xff09; class AbstractSensor { public:virtual ~AbstractSensor() default;virtual QVector<L…

pytorch学习(b站小土堆学习)

1 环境配置 参考链接 2. dir 和 help函数 dir()&#xff1a;用于查看某一模块函数的方法 help()&#xff1a; 用于查看某方法的使用方法 3. dataset类实战 利用Image对象打开图片&#xff0c;利用os模块的地址拼接组成图片路径 当我们用方括号访问元素对象时&#xff0c;…

Unity TextMeshPro 实现文本逐字淡出效果

Unity TextMeshPro 实现文本逐字淡出效果 前言项目思路场景布置代码编写 前言 在处理角色对话时经常会用到一些文本动画&#xff0c;正好记录一下。使用 TextMeshPro&#xff0c;我们可以直接操作文本的顶点数据&#xff0c;实现诸如渐变、动画等效果&#xff0c;为游戏界面和…

Mathtype无法插入到Word中

在word工具栏上有没有出现Mtahtype&#xff0c;会出现以下两种情况&#xff1a; 1. 没有出现Mtahtype 2. 出现Mtahtype&#xff0c;但是点击会出现弹窗 “ Couldnt find the MathPage.wll ” 解决方案 首先查看word版本是32位还是64位&#xff0c;这个位数是office安装位数…

责任链模式_行为型_GOF23

责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;核心思想是将多个处理请求的对象连成一条链&#xff0c;请求沿链传递直到被处理。它像现实中的“多级审批流程”——请假或报销时&#xff0c;申请会逐级提交给…

Qt图形化界面为何总被“冷落“?

在Qt开发者的IDE中&#xff0c;Qt Designer总像一个被遗忘的角落——即便它有着直观的拖拽式界面设计功能。通过分析GitHub上超过5000个Qt项目发现&#xff0c;仅有17%的项目使用.ui文件构建界面。这个数据背后&#xff0c;隐藏着开发者群体对GUI构建方式的集体选择。我们不禁要…

SQL Server从安装到入门一文掌握应用能力。

本篇文章主要讲解,SQL Server的安装教程及入门使用的基础知识,通过本篇文章你可以快速掌握SQL Server的建库、建表、增加、查询、删除、修改等基本数据库操作能力。 作者:任聪聪 日期:2025年3月31日 一、SQL Server 介绍: SQL Server 是微软旗下的一款主流且优质的数据库…

简单视图函数

视图函数 文章目录 视图函数[toc]一、什么是视图函数二、简单视图函数三、返回错误视图 一、什么是视图函数 所谓视图函数&#xff08;简称视图&#xff09;&#xff0c;本质上就是一个Python函数&#xff0c;用于接收Web请求并且返回Web响应。Web响应可以包含很多类型&#x…

QT文件操作(QT实操学习3)

1.项目架构 1.UI界面 1.新建文本文档 2.打开文件 3.另存为文件 2.mainwindow.h​ #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QFileDialog> #include <QMessageBox> #include <QDebug> QT_BEGIN_NAMESPACE namespa…

HX324双运算放大器:赋能万物互联时代的信号处理基石

一、运算放大器行业的技术演进与市场需求 在全球半导体市场规模突破6000亿美元的背景下&#xff0c;模拟芯片作为电子系统的"感官神经"&#xff0c;正迎来智能化升级浪潮。据IC Insights数据显示&#xff0c;2023年全球运算放大器市场规模达32.7亿美元&#xff0c;其…

C++ 结构体与函数

一.结构体 1.概念&#xff1a; 结构体&#xff08;struct&#xff09;是一种用户自定义复合数据类型&#xff0c;其中可以包含不同类型的不同成员 2.结构体的应用场景&#xff1a; 我们在使用多个变量描述一个对象时&#xff0c;虽然也可以做到&#xff0c;但是难免显得杂乱…

Python数据可视化-第1章-数据可视化与matplotlib

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第1章 数据可视化与matplotlib 本文主要介绍了什么是数据集可视化&#xff0c;数据可视化的目的&#xff0c;常见的数据可视化方式…

ESLint报错:Could not find config file.

如果你的ESLint的版本大于 8&#xff0c;同时使用 .eslinrc.js 和 .eslintignore 作为配置文件&#xff0c;且目前用的是 VSCODE &#xff0c;就有可能遇到报错&#xff1a; Could not find config file. 这个是因为 VSCode 中 ESLint 插件的配置 eslint.useFlatConfig 的问题…

基于SpringBoot的“医疗设备管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“医疗设备管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体功能模块图 系统E-R图 系统登录界面 …

WordPress汉主题

WordPress汉主题wphan.com(以下简称WP汉主题)是一个专注于WordPress中文主题与插件开发的专业团队。该团队致力于为中文用户提供高质量的WordPress主题和插件资源&#xff0c;帮助用户轻松创建专业且吸引人的网站。 WP汉主题提供多种功能丰富的WordPress主题&#xff0c;涵盖博…

arthas之jvm相关命令

文章目录 1. dashboard2. thread线程相关3. jvmTHREAD相关文件描述符相关 4. sysprop5. 小结6. sysenv7. vmoption8. getstatic9. ognl10. 小结 1. dashboard 作用&#xff1a;显示当前系统的实时数据面板&#xff0c;按q或ctrlc退出 数据说明 ID: Java级别的线程ID&#xff…

小米平板 4 Plus 玩机日志

在一次偶然中&#xff0c;我从一个角落中找到了这台小米平板 4 Plus&#xff08;是的&#xff0c;现在正在用这个平板写这篇文章&#xff09;。在找到她的时候&#xff0c;她已经奄奄一息了&#xff0c;即使按动那脆弱的电源键也没有任何响应。 在给她补充能源后&#xff0c;她…

MSYS2学习笔记

前言 本文内容是MSys2 Documentation的学习笔记可以使用MSYS2编译QGis 学习笔记 什么是MSYS2&#xff1f; MSYS2&#xff08;Minimal System 2&#xff09;是一个为Windows平台打造的软件开发环境和包管理系统&#xff0c;它结合了Cygwin的POSIX兼容层、Arch Linux的pacman…