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

RabbitMQ 高级特性之重试机制

1. 简介

在消息传递时,有可能会因为网络故障、内存资源不足等不可控原因,导致消息没有成功发送出去,这时我们就可以选择将这条消息进行重新发送。能够重新发送的前提是代码逻辑没有问题。

2. 需要的配置

spring:rabbitmq:listener:simple:acknowledge-mode: autoretry:enabled: true # 开启消费者失败重试initial-interval: 5000ms # 初始失败等待时⻓为5秒max-attempts: 5 # 最⼤重试次数(包括自身消费的⼀次)

在配置信息中设置了消息的重发次数,该次数包括一开始生产者发送消息的那一次。

这里我们需要注意,在使用重试机制时,需要搭配 auto 使用,原因下面进行讲解。

3. auto 与重试机制搭配使用的结果

生产者代码如下:

@RequestMapping("/producer")
@RestController
public class ProducerController {@Resource(name = "rabbitTemplate")private RabbitTemplate rabbitTemplate;/*** 重试机制*/@RequestMapping("/retry")public String retry() {String message = "retry test...";rabbitTemplate.convertAndSend(Constants.RETRY_EXCHANGE, Constants.RETRY_ROUTINGKEY, message);return "消息发送成功";}
}

对于无异常版本的消费者代码,其代码运行结果即正常消费消息,下面只使用有异常版本的消费者代码:

@Slf4j
@Component
public class RetryListener {@RabbitListener(queues = Constants.RETRY_QUEUE)public void listener(Message message) {String messageInfo = new String(message.getBody());long deliveryTag = message.getMessageProperties().getDeliveryTag();log.info("接收消息, message: {}, deliveryTag: {}", messageInfo, deliveryTag);int num = 1 / 0;log.info("消息消费完成");}
}

代码运行结果如下:

由于在消费者代码中出现了除数为 0 的错误,于是消息就消费失败,触发了消息重发机制后兄奥西重发了 4 次,消息一共发送了 5 次。并且在日志中可以看出,这些消息的 deliveryTag 都是相同的。

4. manual 与 重试机制搭配使用的结果

将配置文件的 acknowledge-mode 修改为 manual,并在消费者代码中添加 basicAck 和 basicNack,代码如下:

@Slf4j
@Component
public class RetryListener {@RabbitListener(queues = Constants.RETRY_QUEUE)public void listener(Message message, Channel channel) throws IOException {String messageInfo = new String(message.getBody());long deliveryTag = message.getMessageProperties().getDeliveryTag();try {log.info("接收消息, message: {}, deliveryTag: {}", messageInfo, deliveryTag);int num = 1 / 0;log.info("消息消费完成");channel.basicAck(deliveryTag, false);} catch (Exception e) { //此处的异常必须包含 除数为 0 的异常,不然就不会进入到 catch 中,就导致不会执行 basicNack 方法,就无法将消息重新入队列channel.basicNack(deliveryTag, false, true);}}
}

代码运行结果如下:

从结果中可以看出,虽然设置了重发次数为5次,但是 deliveryTag 却一直在递增,就表示该消息一直在入队列并发送,没有受到重发机制的限制。

所以在重试机制下,搭配 auto 确认模式使用才能发挥效果。

http://www.dtcms.com/a/266404.html

相关文章:

  • 大流量业务云主机选型:AWS、Oracle、DigitalOcean、Linode、阿里云深度对比
  • 硬件嵌入式学习路线大总结(一):C语言与linux。内功心法——从入门到精通,彻底打通你的任督二脉!
  • 服务器 - - QPS与TPS介绍
  • (2)手摸手-学习 Vue3 之 变量声明【ref 和 reactive】
  • Node.js核心API(fs篇)
  • 状态机管家:MeScroll 的交互秩序维护
  • Qt创建线程的方法
  • Winscope在aosp 13/14/15版本的使用总结
  • AI Agent在企业管理中的落地路径:从概念到实践的转型指南
  • 面试版-前端开发核心知识
  • HTML表格导出为Excel文件的实现方案
  • Excel 实现进制转换 Excel十进制转二进制 Excel 中文转unicode Excel实现Unicode转中文
  • 本地部署Dify并结合ollama大语言模型工具搭建自己的AI知识库
  • 面向开发者的API平台设计与选型建议【附源码示例】
  • flutter封装vlcplayer的控制器
  • 如何使用DeepSeek一键生成系统架构图?
  • 如何将大型视频文件从 iPhone 传输到 PC
  • 怎么更改cursor字体大小
  • 10分钟搭建 PHP 开发环境教程
  • VSCode 安装使用教程
  • SQL Server 进阶语法实战:从动态透视到存储过程的深度应用(第四课)
  • 高功率的照明LN2系列助力电子元件薄膜片检测
  • 推荐算法系统系列>推荐数据仓库集市的ETL数据处理
  • GaussDB权限管理:从RBAC到精细化控制的企业级安全实践
  • 设计模式(十)
  • [学习记录]Unity毛发渲染[URP]-Fin基础版
  • Django Channels WebSocket实时通信实战:从聊天功能到消息推送
  • Linux入门篇学习——Linux 帮助手册
  • 八、测试与调试
  • 万勋科技「柔韧机器人玻璃幕墙清洗」全国巡展@上海!引领清洗无人机智能化升级