spring-boot在集成rabbitmq时,如果使用 amqp-client 发送消息,@RabbitListener会一直循环报错

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'no match' threw exceptionat org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:198) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:127) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1521) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1444) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1431) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1410) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:848) [spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:832) [spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:78) [spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1073) [spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_152]
Caused by: org.springframework.amqp.AmqpException: No method found for class [Bat org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.getHandlerForPayload(DelegatingInvocableHandler.java:149) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.adapter.DelegatingInvocableHandler.invoke(DelegatingInvocableHandler.java:129) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:60) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:190) ~[spring-rabbit-2.1.2.RELEASE.jar:2.1.2.RELEASE]... 10 common frames omitted

通过debug发现:

rabbitTemplate.convertAndSend发送的消息默认带有消息头

而amqp-client发送的消息默认是不带消息头的

所以第一种解决办法是在rabbitmq的客户端设置响应的属性

@Testpublic void publishTest() throws IOException {channel.exchangeDeclare("testExchange", "direct", true);channel.queueBind("many", "testExchange", "many");String message = "this is the test";AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder().contentEncoding("UTF-8").contentType("text/plain").headers(new HashMap<String, Object>()).priority(0);channel.basicPublish("testExchange", "many",builder.build(), message.getBytes());}
测试发现问题好像是因为缺少contentType("text/plain")导致的

另外一种解决办法是在 @RabbitListener 增加一些配置

There are two conversions in the @RabbitListener pipeline.
The first converts from a Spring AMQP Message to a spring-messaging Message.
There is currently no way to change the first converter from SimpleMessageConverter which handles String, Serializable and passes everything else as byte[].
The second converter converts the message payload to the method parameter type (if necessary).
With method-level @RabbitListeners there is a tight binding between the handler and the method.
With class-level @RabbitListener s, the message payload from the first conversion is used to select which method to invoke. Only then, is the argument conversion attempted.
This mechanism works fine with Java Serializable objects since the payload has already been converted before the method is selected.
However, with JSON, the first conversion returns a byte[] and hence we find no matching @RabbitHandler.
We need a mechanism such that the first converter is settable so that the payload is converted early enough in the pipeline to select the appropriate handler method.
A ContentTypeDelegatingMessageConverter is probably most appropriate.
And, as stated in AMQP-574, we need to clearly document the conversion needs for a @RabbitListener, especially when using JSON or a custom conversion.

@Configuration
public class RabbitConfig {@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate template = new RabbitTemplate(connectionFactory);template.setMessageConverter(new Jackson2JsonMessageConverter());return template;}@Beanpublic SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);factory.setMessageConverter(new Jackson2JsonMessageConverter());return factory;}
}
@Component
public class ReceiverTwo {@RabbitHandler@RabbitListener(queues = "test", containerFactory="rabbitListenerContainerFactory")public void process(String message) {System.out.println("Receiver: " + message);}
}

配置的@RabbitListeners一定要放在method-level上,否则不生效

当然,这样配置方式并不能保证Consumer端能接收到Message,所以最正确的做法是Producer端配置contentType("text/plain"),既能保证消息发送出去也能保证消息被接收。

Producer的BasicProperties配置选项如下:

解决org.springframework.amqp.AmqpException: No method found for class [B相关推荐

  1. Caused by: org.springframework.amqp.AmqpException: No method found for class [B

    前言 spring boot 2.2.13.RELEASE 错误内容:Caused by: org.springframework.amqp.AmqpException: No method foun ...

  2. org.springframework.amqp.AmqpException: No method found for class [B

    版本:spring-rabbit-1.7.1.RELEASE.jar 错误描述: 调用rabbitTemplate.convertAndSend(exchange, routingKey, objec ...

  3. 解决org.springframework.amqp.AmqpIOException: java.io.IOException错误

    今天安装好rabiitmq,创建了一个队列,进行测试发现报这个错误 Caused by: org.springframework.amqp.AmqpIOException: java.io.IOExc ...

  4. SpringBoot集成rabbitmq错误:org.springframework.amqp.AmqpConnectException: java.net.ConnectException的解决办法

    在集成rabbitmq后,运行项目,报错日志: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Co ...

  5. org.springframework.amqp.AmqpConnectException java.net.ConnectException的解决办法

    一.报错信息 spring cloud集成rabbitmq时报错: org.springframework.amqp.AmqpTimeoutException: java.util.concurren ...

  6. Error creating bean with name 'org.springframework.amqp.rabbit.config.ListenerContainerFactoryBean#0

    Spring 整合rabbitmq 出现错误 严重: Exception sending context initialized event to listener instance of class ...

  7. RabbitMq org.springframework.amqp.AmqpIOException: java.io.IOException

    出现问题 org.springframework.amqp.AmqpIOException: java.io.IOExceptionat org.springframework.amqp.rabbit ...

  8. org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not supported

    错误描述: org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'PUT' not suppo ...

  9. RabbitMq 本地连接报错 org.springframework.amqp.AmqpIOException: java.io.IOException

    前言 上一篇博客讲述了ubuntu 16.04上如何安装RabbitMq,并通过web管理界面远程访问. 紧接着我在自己搭建的spring boot项目中,整合了RabbitMq,本地启动项目,发现控 ...

最新文章

  1. Java入门学习注意事项有哪些?
  2. 网络营销外包——网络营销外包专员如何帮助企业挑选网站建设类型
  3. 一站式学习Redis 从入门到高可用分布式实践(慕课)第六章 Redis开发运维常见问题...
  4. kubeadm安装k8s 1.13版本
  5. 实验三 类的继承和多态性
  6. Spark Streaming之Kafka的Receiver和Direct方式
  7. final、static、finally总结
  8. CSS相关知识点:6种清除浮动和BFC
  9. 用 Python 轻松搞定 Excel 中的 20 个常用操作
  10. 从虚拟化到软件定义--重新定义IT产业格局
  11. u盘安全弹出有什么用?数据丢失还能恢复吗
  12. UEditor上传文件大小超限,上传失败问题解决
  13. 洛谷[P3374] [P3368]树状数组(线段树解法)
  14. JavaScript:实现加密哈希SHA-1 算法(附完整源码)
  15. vue 上次登录时间_Vue设置长时间未操作登录自动到期返回登录页
  16. Python学习-操作列表
  17. 计算机汉字字模信息怎么算,汉字字模库字模.PPT
  18. SDUT OJ 蟠桃记
  19. [SRv6]《SRv6网络编程》SRv6网络在电信云中的应用
  20. matlab+whisker,科学网—如何绘制箱线图(Box- Whisker Chart) - 陆绮的博文

热门文章

  1. openwrt 上网记录_折腾OpenWRT小记
  2. 【Java二十周年】爱上Java无法自拔
  3. idea 配置idk
  4. 【Mac】Mac 访达 侧边栏 消失
  5. 扫二维码时判断手机是安卓还是IOS
  6. linux怎么在目录下查找文件,linux find-在指定目录下查找文件
  7. 找出一批学生的最高分
  8. 【Spring Boot学习】今天是我的生日,舍友催我去吃饭,我还是坚持写完了Spring Boot配置文件,祝自己生日快乐哈
  9. 商城项目实战31:solar服务器搭建、搜索功能实现
  10. “避开”std::map自动排序