今天项目中出现一个诡异的异常:

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
修饰的方法,即队列的监听函数,不能返回任何值!否则会导致一个rabbit reply message  回复异常,该异常是由于此方法返回的消息没有设置目的地,查看源码可以看出:
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;}

而我的代码为什么会出现这个异常呢?

因为Groovy的方法会自动将最后一句的结果返回,所有不能使用def定义方法,而应该使用void!

解决后的代码为:

@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相关推荐

  1. Spring boot 解决 hibernate no session异常

    Spring boot 解决 hibernate no session异常 参考文章: (1)Spring boot 解决 hibernate no session异常 (2)https://www. ...

  2. spring boot整合RabbitMQ —— 十分钟急速上手

    安装运行rabbitmq 1.docker安装rabbitmq: docker run -it --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq ...

  3. Spring Boot 整合 RabbitMQ 实现

    Spring Boot 整合 RabbitMQ 实现 1. 开发环境搭建 1.1 pom配置 1.2 application.yml配置 2. 消费者模块(springboot-rabbitmq-co ...

  4. Spring Boot: Spring Boot 整合 RabbitMQ

    前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用来做应 ...

  5. Spring Boot 集成 RabbitMq 实战操作(二)

    本人学习新框架方法. 一.先学习框架基本知识,也就是看这本书的前三章,了解基本概念.比如这个Rabbitmq,我会先看一些概念,比如,交换机,路由器,队列,虚拟机. 二.然后写代码,写demo,有哪些 ...

  6. 【消息中间件】Spring Boot整合RabbitMQ

    简介 在Spring项目中,可以使用Spring-Rabbit去操作RabbitMQ 尤其是在spring boot项目中只需要引入对应的amqp启动器依赖即可,方便的使用RabbitTemplate ...

  7. Spring boot集成RabbitMQ(山东数漫江湖)

    RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统  MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写 ...

  8. Spring boot集成RabbitMQ

    ####RabbitMQ简介 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通 ...

  9. spring boot(八)RabbitMQ使用

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...

  10. Spring boot整合rabbitmq

    一.生产者 1.pom.xml <properties><maven.compiler.source>8</maven.compiler.source><ma ...

最新文章

  1. leetcode算法题--字符串转换整数 (atoi)
  2. [C++]VisualAssistX中文注释提示错误 解决办法
  3. Java 动态代理机制分析及扩展,第 1 部分
  4. SSM框架之MyBatis3专题5:MyBatis注解式开发
  5. Contiki系统介绍
  6. qt 苹果应用程序_什么是苹果的电视应用程序,您应该使用它吗?
  7. LeetCode 链表的插入排序
  8. 搭建个人博客,还有比这更快的?
  9. sql2000数据库备份文件还原到sql2005
  10. dubbo-admin的编译安装
  11. mysql经典sql语句大全_经典SQL语句大全
  12. OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
  13. 2021-09-06单纯形计算方法(
  14. 学习笔记(一)数据挖掘概念与技术
  15. android设置默认程序图标,android – 更改默认系统应用程序图标
  16. 生物信息(bioinformation)学名词解释
  17. Java生成token的工具类(对称签名)
  18. matlab学霸表白公式,【爱情物理学】520来了,看看理科学霸们创意的表白方式
  19. 2018云原生技术实践峰会CNBPS 重新定义云原生
  20. ESP8266--SDK开发(TCP服务端)

热门文章

  1. 【MATLAB】创建网格图和曲面图
  2. iOS开发-常用第三方开源框架介绍
  3. 如何保障短网址的安全性?
  4. python ca模块_[转]常用的python模块及安装方法
  5. [学习日志]UI如何与数据绑定?
  6. 电脑实用技巧:给大家推荐5种低成本笔记本散热方式
  7. 黑苹果虚拟机——显卡只有7M玩玩就行
  8. 同一方法被多个Aspect拦截, 修改切面@Around @Before的执行顺序
  9. c语言学生班级通讯录,C语言做学生通讯录
  10. git使用——15.搭建自己的gitlab服务器来存放我们的git项目