错误如下:
org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method could not be invoked with the incoming message
Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.ruoyi.orderdemo.entity.Order] for GenericMessage [payload=byte[111], headers={amqp_receivedDeliveryMode=PERSISTENT, amqp_receivedRoutingKey=order.abcd, amqp_contentEncoding=UTF-8, amqp_receivedExchange=order-exchange, amqp_deliveryTag=1, amqp_consumerQueue=order-queue, amqp_redelivered=false, id=f475f6be-185e-cdcd-8c07-00ba612dedcb, amqp_consumerTag=amq.ctag-Z2OEnBegH7AtVyO8uVPdYA, contentType=application/json, __TypeId__=com.myy.springbootproducer.entity.Order, timestamp=1608114763204}]
原因:
从异常信息中可以看到是消费者对消息反序列化的时候失败了。
解决:
使用 JSON 序列化与反序列化
- RabbitMQ提供了Jacksonv2JsonMessageConverter来支持内容JSON序列化与反序列化
生产者发送消息配置
package com.myy.springbootproducer.config;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author 熊贝贝
* @company
* @create 2020-12-16 17:40
*/
@Configuration
public class MyAMQConfig {
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
消费者消费消息配置
package com.ruoyi.web.controller;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author 熊贝贝
* @company
* @create 2020-12-16 18:27
*/
@Configuration
public class RabbitMQConfig {
@Bean
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory){
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
}
注意:被序列化对象应提供一个无参的构造函数,否则会抛出异常