我们知道rabbitTemplate
的默认转换器是SimpleMessageConverter
。具体如何找到的放在最后
我们如果使用convertAndSend()
去发送一个列表,在接收的时候我们就需要从Message
对象中获取字节数组然后反序列化才能得到正确的消息,甚是麻烦。
可能有人会问我们在消费消息的时候可以直接写在方法参数上。没错,可以这么写,但是消息是列表的时候会出现意外,我们得到的消息并不是我们期望的列表而是一个字节列表
这个时候我们就需要重新设置一下rabbitTemplate
的converter
,以及指定接收方法的containerFactory
设置converter
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
仅需这么一行即可
我们可以在发送消息之前去设置也可以全局设置。
如果团队中约定了转换器,那么每次发送消息之前去设置就不是很合理。使用如下方式进行全局设置
@Bean
public RabbitTemplate rabbitJsonTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}
指定接收方法的containerFactory
定义containerFactory
@Bean
public SimpleRabbitListenerContainerFactory jsonContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
// 设置连接
factory.setConnectionFactory(connectionFactory);
// 设置 ack 模式为手动
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
// 设置转换器
factory.setMessageConverter(new Jackson2JsonMessageConverter());
return factory;
}
使用containerFactory
@RabbitListener(containerFactory = "jsonContainerFactory", bindings = @QueueBinding(
exchange = @Exchange(EXCHANGE),
value = @Queue(QUEUE),
key = ROUTING_KEY
))
public void listener(List<A> list, Channel channel, Message message) throws IOException {
log.info("------------------------------------------------");
log.info("{}", list);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
⚠️注意:
containerFactory = "jsonContainerFactory"
这里是写bean名称
除了在方法参数上直接接收外我们还可以用fromMessage()
来反序列化消息
List<A> ls = null;
try {
ls = (List) new Jackson2JsonMessageConverter().fromMessage(message);
} catch (MessageConversionException e) {
log.error("deser err:", e);
}
个人比较推荐参数的形式
默认converter寻找
我们首先打开org.springframework.amqp.rabbit.core.RabbitTemplate
类的构造方法
我们看到在无构造参数的情况下,默认转换器是SimpleMessageConverter
会有另外一种情况,那就是实例化的时候使用的不是无参构造。我们继续看
这是RabbitTemplate
类成员变量,也就是说无论我们使用哪一个构造方法实例化RabbitTemplate
得到的默认转换器都是SimpleMessageConverter
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195208.html