spring boot + rabbitmq 传递列表消息

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。spring boot + rabbitmq 传递列表消息,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

我们知道rabbitTemplate的默认转换器是SimpleMessageConverter。具体如何找到的放在最后

我们如果使用convertAndSend()去发送一个列表,在接收的时候我们就需要从Message对象中获取字节数组然后反序列化才能得到正确的消息,甚是麻烦。
可能有人会问我们在消费消息的时候可以直接写在方法参数上。没错,可以这么写,但是消息是列表的时候会出现意外,我们得到的消息并不是我们期望的列表而是一个字节列表

这个时候我们就需要重新设置一下rabbitTemplateconverter,以及指定接收方法的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类的构造方法
image.png
我们看到在无构造参数的情况下,默认转换器是SimpleMessageConverter
会有另外一种情况,那就是实例化的时候使用的不是无参构造。我们继续看
image.png
这是RabbitTemplate类成员变量,也就是说无论我们使用哪一个构造方法实例化RabbitTemplate得到的默认转换器都是SimpleMessageConverter

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195208.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!