Spring Boot使用RabbitMQ出现诡异异常:Failed to send reply with payload 'OK',Cannot determine ReplyTo message
今天项目中出现一个诡异的异常:
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener threw exceptionat org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.wrapToListenerExecutionFailedExceptionIfNeeded(AbstractMessageListenerContainer.java:915)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:825)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:745)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$001(SimpleMessageListenerContainer.java:97)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$1.invokeListener(SimpleMessageListenerContainer.java:189)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:1276)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:726)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1219)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1189)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1500(SimpleMessageListenerContainer.java:97)at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1421)at java.lang.Thread.run(Thread.java:745)
Caused by: org.springframework.amqp.rabbit.listener.adapter.ReplyFailureException: Failed to send reply with payload 'OK'at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:285)at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:108)at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:822)... 10 common frames omitted
Caused by: org.springframework.amqp.AmqpException: Cannot determine ReplyTo message property value: Request message does not contain reply-to property, and no default response Exchange was set.at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.getReplyToAddress(AbstractAdaptableMessageListener.java:373)at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:281)... 12 common frames omitted
项目使用Spring Boot、Gradle、Groovy、RabbitMQ,出现异常的代码如下:
@RabbitListener(queues = Constants.POST_PUSH_QUEUE_THIRD_REDIS)@RabbitHandlerdef processThirdRedis(Article article) throws Exception {def key = REDIS_ARTICLE_PREFIX + article.idredisService.set(key, JsonUtil.toJson(article))}
终于在这里找到了答案。
原来,使用
@RabbitListener(queues = Constants.POST_PUSH_QUEUE_THIRD_REDIS)@RabbitHandler
protected void handleResult(Object resultArg, Message request, Channel channel, Object source) throws Exception {if (channel != null) {if (this.logger.isDebugEnabled()) {this.logger.debug("Listener method returned result [" + resultArg+ "] - generating response message for it");}try {Object result = resultArg instanceof ResultHolder ? ((ResultHolder) resultArg).result : resultArg;Message response = buildMessage(channel, result);postProcessResponse(request, response);Address replyTo = getReplyToAddress(request, source, resultArg);sendResponse(channel, replyTo, response);}catch (Exception ex) {throw new ReplyFailureException("Failed to send reply with payload '" + resultArg + "'", ex);}}else if (this.logger.isWarnEnabled()) {this.logger.warn("Listener method returned result [" + resultArg+ "]: not generating response message for it because no Rabbit Channel given");}}
其中getReplyToAddress()方法:
protected Address getReplyToAddress(Message request, Object source, Object result) throws Exception {Address replyTo = request.getMessageProperties().getReplyToAddress();if (replyTo == null) {if (this.responseAddress == null && this.responseExchange != null) {this.responseAddress = new Address(this.responseExchange, this.responseRoutingKey);}if (result instanceof ResultHolder) {replyTo = evaluateReplyTo(request, source, result, ((ResultHolder) result).sendTo);}else if (this.responseExpression != null) {replyTo = evaluateReplyTo(request, source, result, this.responseExpression);}else if (this.responseAddress == null) {throw new AmqpException("Cannot determine ReplyTo message property value: " +"Request message does not contain reply-to property, " +"and no default response Exchange was set.");}else {replyTo = this.responseAddress;}}return replyTo;}
而我的代码为什么会出现这个异常呢?
解决后的代码为:
@RabbitListener(queues = Constants.POST_PUSH_QUEUE_THIRD_REDIS)@RabbitHandlervoid processThirdRedis(Article article) throws Exception {def key = REDIS_ARTICLE_PREFIX + article.idredisService.set(key, JsonUtil.toJson(article))}
Spring Boot使用RabbitMQ出现诡异异常:Failed to send reply with payload 'OK',Cannot determine ReplyTo message相关推荐
- Spring boot 解决 hibernate no session异常
Spring boot 解决 hibernate no session异常 参考文章: (1)Spring boot 解决 hibernate no session异常 (2)https://www. ...
- spring boot整合RabbitMQ —— 十分钟急速上手
安装运行rabbitmq 1.docker安装rabbitmq: docker run -it --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq ...
- Spring Boot 整合 RabbitMQ 实现
Spring Boot 整合 RabbitMQ 实现 1. 开发环境搭建 1.1 pom配置 1.2 application.yml配置 2. 消费者模块(springboot-rabbitmq-co ...
- Spring Boot: Spring Boot 整合 RabbitMQ
前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用来做应 ...
- Spring Boot 集成 RabbitMq 实战操作(二)
本人学习新框架方法. 一.先学习框架基本知识,也就是看这本书的前三章,了解基本概念.比如这个Rabbitmq,我会先看一些概念,比如,交换机,路由器,队列,虚拟机. 二.然后写代码,写demo,有哪些 ...
- 【消息中间件】Spring Boot整合RabbitMQ
简介 在Spring项目中,可以使用Spring-Rabbit去操作RabbitMQ 尤其是在spring boot项目中只需要引入对应的amqp启动器依赖即可,方便的使用RabbitTemplate ...
- Spring boot集成RabbitMQ(山东数漫江湖)
RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写 ...
- Spring boot集成RabbitMQ
####RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通 ...
- spring boot(八)RabbitMQ使用
RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...
- Spring boot整合rabbitmq
一.生产者 1.pom.xml <properties><maven.compiler.source>8</maven.compiler.source><ma ...
最新文章
- leetcode算法题--字符串转换整数 (atoi)
- [C++]VisualAssistX中文注释提示错误 解决办法
- Java 动态代理机制分析及扩展,第 1 部分
- SSM框架之MyBatis3专题5:MyBatis注解式开发
- Contiki系统介绍
- qt 苹果应用程序_什么是苹果的电视应用程序,您应该使用它吗?
- LeetCode 链表的插入排序
- 搭建个人博客,还有比这更快的?
- sql2000数据库备份文件还原到sql2005
- dubbo-admin的编译安装
- mysql经典sql语句大全_经典SQL语句大全
- OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
- 2021-09-06单纯形计算方法(
- 学习笔记(一)数据挖掘概念与技术
- android设置默认程序图标,android – 更改默认系统应用程序图标
- 生物信息(bioinformation)学名词解释
- Java生成token的工具类(对称签名)
- matlab学霸表白公式,【爱情物理学】520来了,看看理科学霸们创意的表白方式
- 2018云原生技术实践峰会CNBPS 重新定义云原生
- ESP8266--SDK开发(TCP服务端)
热门文章
- 【MATLAB】创建网格图和曲面图
- iOS开发-常用第三方开源框架介绍
- 如何保障短网址的安全性?
- python ca模块_[转]常用的python模块及安装方法
- [学习日志]UI如何与数据绑定?
- 电脑实用技巧:给大家推荐5种低成本笔记本散热方式
- 黑苹果虚拟机——显卡只有7M玩玩就行
- 同一方法被多个Aspect拦截, 修改切面@Around @Before的执行顺序
- c语言学生班级通讯录,C语言做学生通讯录
- git使用——15.搭建自己的gitlab服务器来存放我们的git项目