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

RabbitMQ在手动消费的模式下设置失败重新投递策略

最近在写RabbitMQ的消费者,因为业务需求,希望失败后重试一定次数,超过之后就不处理了,或者放入死信队列。我这里就达到重试次数后就不处理了。本来以为很简单的,问了kimi,按它的方法配置之后,发现报错之后一直重复消费,进入了死循环。

下面是kimi给的“最佳实践”的示例代码:

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.RabbitListenerEndpointRegistrar;
import org.springframework.amqp.rabbit.listener.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {@Beanpublic SimpleRabbitListenerContainerFactory myFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);return factory;}
}import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class RabbitMQConsumer {@RabbitListener(queues = "your-queue-name", containerFactory = "myFactory")public void receiveMessage(final Message message, com.rabbitmq.client.Channel channel) {// 消息处理逻辑try {String payload = new String(message.getBody());System.out.println("Received message: " + payload);// 业务逻辑处理// ...// 手动确认消息channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {System.out.println("Error processing message: " + e.getMessage());try {// 拒绝消息并重新入队channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);} catch (Exception ex) {// 如果消息拒绝失败,则关闭通道channel.close();}}}
}

问题出在哪里呢?

看起来是很完美的,但是......,还是有漏洞:

这样写是有问题的,会导致失败后消息重新入队,应该是因为重新计算重试次数,如果一直失败,就一直重试,一直清空,那永远不能达到最大次数,导致死循环......

所以,这个地方正确的处理方式是抛异常,

直接throw 一个异常即可。这样就能正确重试了。

这个过程参考了这个博文:rabbitmq消费(失败)重试3次(多次) - 幂次方 - 博客园

总结教训:AI不是万能的,如果按AI的方案得不到结果,有可能是它出错了,毕竟它的方案是没有经过实践检验的。这个时候就会发现原始资料的重要性了。博客还是有它存在的价值的。

http://www.lryc.cn/news/493831.html

相关文章:

  • TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证
  • 【Linux】线程池设计 + 策略模式
  • 网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识
  • Python-链表数据结构学习(1)
  • 性能优化经验:关闭 SWAP 分区
  • SpringBoot小知识(2):日志
  • java虚拟机——jvm是怎么去找垃圾对象的
  • Macos远程连接Linux桌面教程;Ubuntu配置远程桌面;Mac端远程登陆Linux桌面;可能出现的问题
  • hadoop_HA高可用
  • 【MySQL】MySQL中的函数之JSON_ARRAY_APPEND
  • torch.is_nonzero(input)
  • 文本搜索程序(Qt)
  • 使用 Python 剪辑视频的播放速度
  • 深入理解计算机系统,源码到可执行文件翻译过程:预处理、编译,汇编和链接
  • Linux开发者的CI/CD(11)jenkins变量
  • 深度学习视频编解码开源项目介绍【持续更新】
  • Canva迁移策略深度解析:应对每日5000万素材增长,从MySQL到DynamoDB的蜕变
  • nacos常见面试题(2024)
  • 68000汇编实战01-编程基础
  • 你的网站真的安全吗?如何防止网站被攻击?
  • UE5 材质编辑器CheapContrast 节点
  • 健身房小程序服务渠道开展
  • Java基础面试题08:Java中Exception和Error有什么区别?
  • 什么是axios?怎么使用axios封装Ajax?
  • Web前端学习_CSS盒子模型
  • JAVA项目-------医院挂号系统
  • [工具分享] 根据Excel数据根据Word文档模板,批量创建生成Word文档并重命名,方便快速查找打印
  • Redis的管道操作
  • IT监控 | Oracle云监控全解析
  • 前端面试题-1(详解事件循环)