当前位置: 首页 > news >正文

rabbitmq 重试机制

前言

在消息传递过程中,可能会遇到各种问题,如网络故障,服务不可用,资源不足等,这些问题可能导致消息处理失败.为了解决这些问题,RabbitMQ提供了重试机制,允许消息在处理失败后重新发送.

但如果是程序逻辑引起的错误,那么多次重试也是没有用的,如果重复入队反复消费这是不可取的,因此我们可以设置重试次数

配置信息

我们先将 确认模式调成默认的 (auto)

spring:rabbitmq:addresses: xxxxlistener:simple:acknowledge-mode: auto # 设置确认模式retry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时长为5秒max-attempts: 5 # 最大重试次数 包括(包括自身消费的⼀次) 

initial-interval 和 max-attempts 大家可以自行发挥

这里的最大重试次数包括自身消费的一次,是指,第一次发送给消费者也算进重试次数

代码演示

AUTO 模式

常量类:

    //消息退回public static final String RETRY_QUEUE = "RETRY_QUEUE";

声明队列:

    //重试机制@Bean("retryQueue")public Queue retryQueue() {return QueueBuilder.durable(MQConstants.RETRY_QUEUE).build();}

生产者:

    @RequestMapping("/retry")public String retry() {rabbitTemplate.convertAndSend("", MQConstants.RETRY_QUEUE, "retry");return "消息发送成功";}

消费者:

@Component
@RabbitListener(queues = "RETRY_QUEUE")
public class RetryListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {System.out.println("接收到的消息:" + messageContent);int n = 10 / 0; //添加异常,观察重试System.out.println("消息消费成功");}
}

运行程序观察:
在这里插入图片描述
在这里插入图片描述

在AUTO模式下,重试次数达到指定次数之后,就会将消息丢弃

NONE 模式

配置信息:

spring:application:name: abbitExtensionDemorabbitmq:addresses: xxxxlistener:simple:acknowledge-mode: none  # 设置确认模式retry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时长为5秒max-attempts: 5 # 最大重试次数

NONE 和 AUTO 模式一样,消息达到重试次数之后,就会自动丢弃
在这里插入图片描述
在这里插入图片描述

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

MAMUAL 模式

配置信息

spring:application:name: abbitExtensionDemorabbitmq:addresses: xxxxlistener:simple:acknowledge-mode: manual  # 设置确认模式retry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时长为5秒max-attempts: 5 # 最大重试次数

消费者使用手动确认机制:

@Component
@RabbitListener(queues = "RETRY_QUEUE")
public class RetryListener {@RabbitHandlerpublic void handle(String messageContent, Channel channel, Message message) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();try {System.out.println("接收到的消息:" + messageContent);int n = 10 / 0;System.out.println("消息消费成功");channel.basicAck(deliveryTag, false);} catch (Exception e) {channel.basicNack(deliveryTag, false, true);}}
}

在这里插入图片描述
在这里插入图片描述

这里也不受重试次数的限制,一直重新入队

这里的 unacked 是指没有收到确认的消息,不是收到否定确认的消息数量,否定确认和肯定确认都是确认,大家不要混淆


当我们将设置不重新入队的时候:

channel.basicNack(deliveryTag, false, false);

在这里插入图片描述

消息没有进行重试,并且队列也为空了

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

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

总结

使用重试机制时需要注意:
1.自动确认和默认模式下:程序逻辑异常,多次重试还是失败,消息就会被自动确认,那么消息就丢失
2. 手动确认模式下:程序逻辑异常,多次重试消息依然处理失败,无法被确认,就一直是unacked的状态,导致消息积压


文章转载自:

http://SgBKBjUN.Lfcfn.cn
http://vU5NJcap.Lfcfn.cn
http://d4xbmb9K.Lfcfn.cn
http://zAqtRt7z.Lfcfn.cn
http://acEl1ivU.Lfcfn.cn
http://1dVLXb0u.Lfcfn.cn
http://QmouoRRQ.Lfcfn.cn
http://3pabyyq8.Lfcfn.cn
http://golKqsOk.Lfcfn.cn
http://6jXMQwYb.Lfcfn.cn
http://4u9Od1FK.Lfcfn.cn
http://cw6nIOXt.Lfcfn.cn
http://AMGSVnYE.Lfcfn.cn
http://vz1zbalq.Lfcfn.cn
http://2ctpim6z.Lfcfn.cn
http://k6NuCIVk.Lfcfn.cn
http://lNgF53sJ.Lfcfn.cn
http://CYsr2zfu.Lfcfn.cn
http://buUQaHoq.Lfcfn.cn
http://MeCPXtgw.Lfcfn.cn
http://0JHgV695.Lfcfn.cn
http://zK6Ny64s.Lfcfn.cn
http://l0JiowjP.Lfcfn.cn
http://sp8omPN4.Lfcfn.cn
http://JzMHWfoC.Lfcfn.cn
http://tX6c3MBW.Lfcfn.cn
http://ToNZfrzN.Lfcfn.cn
http://6wEAYV76.Lfcfn.cn
http://zhXuUDAB.Lfcfn.cn
http://umSrr0w7.Lfcfn.cn
http://www.dtcms.com/a/371296.html

相关文章:

  • 《C++进阶之STL》【set/map 使用介绍】
  • 【RabbitMQ】----初识 RabbitMQ
  • WebRTC开启实时通信新时代
  • JVM-默背版
  • Java内存区域与内存溢出
  • Python3使用Flask开发Web项目新手入门开发文档
  • 深入理解跳表:多层索引加速查找的经典实现
  • 从 “Hello AI” 到企业级应用:Spring AI 如何重塑 Java 生态的 AI 开发
  • 大模型架构演进全景:从Transformer到下一代智能系统的技术路径(MoE、Mamba/SSM、混合架构)
  • leetcode 912 排序数组(归并排序)
  • Flutter SDK 安装与国内镜像配置全流程(Windows / macOS / Linux)
  • 【算法】92.反转链表Ⅱ--通俗讲解
  • Spring Cloud Alibaba快速入门02-Nacos(上)
  • Selenium自动化测试
  • B.50.10.11-Spring框架核心与电商应用
  • 芯片ATE测试PAT(Part Average Testing)学习总结-20250916
  • Visual acoustic Field,360+X论文解读
  • Android系统更新系统webview. 2025-09-06
  • Simulink子系统、变体子系统及封装知识
  • 详解 Java 中的 CopyOnWriteArrayList
  • FTL(Flash Translation Layer)
  • C++输出字符串的统一码(Unicode Code)和 ASCII 码
  • 【PCIe EP 设备入门学习专栏 -- 8.1.2 PCIe EP 通路详细介绍】
  • nginx安装部署(备忘)
  • 6.虚拟化历史
  • 疯狂星期四文案网第62天运营日记
  • AI工程师对于AI的突发奇想
  • 模电仿真软件:MultSim14.3下载与安装
  • 心路历程-passwdusermod命令补充
  • 自旋锁/互斥锁 设备树 iic驱动总线 day66 67 68