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

spring中使用rabbitmq延迟插件踩坑

问题描述

使用 rabbitmq_delayed_message_exchange 插件时,ReturnCallback 会被强制触发,错误码302,错误信息为NO_ROUTE。

问题复现

spring配置如下

spring.rabbitmq.host=
spring.rabbitmq.port=
spring.rabbitmq.virtual-host=
spring.rabbitmq.username=
spring.rabbitmq.password=
# 下面两个配置都可以
spring.rabbitmq.template.mandatory=true
spring.rabbitmq.publisher-returns=true

配置ReturnCallback的代码如下

package com.imooc.mq.config;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;@Slf4j
@Configuration
public class RabbitTemplateConfig implements InitializingBean {@Autowiredprivate RabbitTemplate rabbitTemplate;@Overridepublic void afterPropertiesSet() throws Exception {rabbitTemplate.setReturnsCallback(returned -> {try {String exchange = returned.getExchange();String routingKey = returned.getRoutingKey();Message amqpMessage = returned.getMessage();Object msgBody = rabbitTemplate.getMessageConverter().fromMessage(amqpMessage);String error = returned.getReplyCode() + " " + returned.getReplyText();log.error("MQ消息发送失败 returnCallback exchange: {}, routingKey: {}, msgBody: {}, error: {}", exchange, routingKey, JSON.toJSONString(msgBody), error);} catch (Exception e) {log.error("MQ消息发送失败", e);}});}
}

配置延迟插件的交换机代码如下

@Bean
public CustomExchange retryExchange() {Map<String, Object> args = new HashMap<>();args.put("x-delayed-type", "direct"); // 底层路由模式return new CustomExchange("xxx","x-delayed-message", // 固定类型true,  // 持久化false, // 不自动删除args);
}

这种情况下,发送延迟消息,rabbitmq都会回调return异常处理器,我们就没办法和正常的错误(未配置队列)区分开了。

问题原因

延迟插件的核心逻辑是:

  • 消息先被暂存在交换机中,不会立即路由到队列;
  • 等延迟时间到期后,插件才会将消息投递到目标队列。

因此,在消息首次发送到交换机时,队列是不可达的,Spring AMQP 会触发 ReturnCallback 通知 “消息未被路由”。这不是 bug,而是插件机制本身的设计。

解决方法

  1. 关闭 return 回调(全局配置)
spring.rabbitmq.template.mandatory=true
spring.rabbitmq.publisher-returns=true

去除这两个配置,或者配置为false,并去除returnCallback
2. 忽略延迟交换机
在发送延迟消息时,消息头增加指定属性,在returnCallback处理时忽略包含属性的消息

http://www.gsyq.cn/news/177149.html

相关文章:

  • 树链剖分
  • COMSOL三维采空区通风条件下的氧气与瓦斯浓度分布
  • CSS 列表
  • 企业级AI开发环境:PyTorch-CUDA镜像支持Kubernetes编排
  • PyTorch安装教程GPU版:Raspberry Pi能否运行?
  • Anaconda配置PyTorch环境并安装torchaudio教程
  • Java毕设项目推荐-基于springboot的家政服务撮合与评价平台服务项目管理、预约订单管理、服务记录管理、评价与反馈管理【附源码+文档,调试定制服务】
  • YOLOv5训练提速秘诀:使用PyTorch-CUDA-v2.8镜像释放GPU潜力
  • 别等胃病找上门:现在开始养胃还不晚
  • GitHub Projects管理PyTorch-CUDA开发进度看板
  • node+vue网上药店购物药品商城管理系统
  • 清华镜像站维护期间的临时替代方案建议
  • PyTorch-CUDA-v2.8镜像支持哪些Linux发行版?兼容性分析
  • 清华镜像源配置教程:加速PyTorch及相关库的安装流程
  • 旅程终章,星光满载:我的软件工程实践总结
  • Anaconda配置PyTorch环境并安装OpenCV图像处理库
  • Anaconda配置PyTorch环境并集成JupyterLab操作指南
  • CipherScan终极指南:快速检测SSL/TLS配置的强大工具
  • Anaconda配置PyTorch环境并安装torchvision全流程
  • 大规模向量检索优化:Binary Quantization 让 RAG 系统内存占用降低 32 倍
  • Java毕设项目:基于springboot的家政服务撮合与评价平台家政需求、筛选服务人员、查看评价记录,服务人员接收订单(源码+文档,讲解、调试运行,定制等)
  • 基于Java的基础数据维护智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 基于Java的基础服务智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 计算机Java毕设实战-基于springboot的家政服务撮合与评价平台保洁、月嫂、养老护理、家电维修等多个领域【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Jupyter Notebook界面操作指南:基于PyTorch-CUDA-v2.8实战教学
  • 清华镜像源加速PyTorch相关依赖安装,配合CUDA镜像更流畅
  • 别急着算距离——聊聊《最短单词距离 II》背后的工程思维
  • Conda与Pip共存环境下PyTorch的安装注意事项
  • 如何通过SSH访问PyTorch-CUDA-v2.8镜像进行远程调试?
  • 图腾柱PFC算法,仿真