一文带你了解RabbitMQ消息转换器

 更新时间:2023年04月02日 09:20:00   作者:小威要向诸佬学习呀  
这篇文章主要为大家详细介绍了RabbitMQ中消息转换器的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下

在SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP会帮我们序列化为字节后发送。

我们以实际例子来做一个演示,首先在项目中的FanoutConfig配置类声明一个新的队列:

package cn.itcast.mq.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FanoutConfig {
    @Bean
    public Queue objectQueue(){
        return new Queue("object.queue");
    }
}

接着我们在生产者模块中编写发送消息的测试代码:

package cn.itcast.mq.spring;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.HashMap;
import java.util.Map;

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Test
    public void testSendObjectQueue(){
        Map<String,Object> msg =new HashMap<>();//创建一个map集合
        msg.put("name","小威");
        msg.put("age",21);
        rabbitTemplate.convertAndSend("object.queue",msg);//发送消息
    }
}

消息发送代码编写完成后,重启项目,打开RabbitMQ的虚拟机对应地址可以看到我们编写的name和age出现了特殊的情况:

这是因为RabbitMQ只支持字节的序列化方式,spring支持发送object对象消息,由上图可以看到content_type的转化方式,spring将封装的map对象序列化了一长串字符串。

那么我们该如何解决这个问题呢?

首先,Spring的消息对象的处理是由org.springframework.amqp.support.converter.MessageConverter来处理的。默认实现是SimpleMessageConverter,基于JDK的ObjectOutputStream完成序列化。

因此,我们需要定义一个MessageConverter 类型的Bean,可以使用json的方式序列化,在父工程中引入json的依赖:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

然后在生产者模块的启动类中声明bean:

package cn.itcast.mq;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.Jackson2XmlMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class PublisherApplication {
    public static void main(String[] args) {
        SpringApplication.run(PublisherApplication.class);
    }
    @Bean
    public MessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

再次重启生产者模块可以看到我们想要的消息对象结果了:

对于消费者也同理,首选引入依赖,接着在启动类中编写和生产者一样的代码,最后定义一个消费者监听该队列:

    @RabbitListener(queues = "object.queue")
    public void listenObjectQueue(Map<String,Object> msg){
        System.out.println("接受到object.queue的消息:"+msg);
    }

启动消费者模块可以看到控制台输出的结果:

到此这篇关于一文带你了解RabbitMQ消息转换器的文章就介绍到这了,更多相关RabbitMQ消息转换器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 九个动画组图轮播总结全栈数据结构数组链表

    九个动画组图轮播总结全栈数据结构数组链表

    数据结构和算法是密不可分的,两者往往是相辅相成的存在,所以在学习数据结构过程中,不免会遇到各种算法,数据结构常用操作一般为:增删改查。基本上所有的数据结构都是围绕这几个操作进行展开,本文用九张动图来阐述先进后出的数据结构
    2021-08-08
  • Java基本数据类型与类型转换实例分析

    Java基本数据类型与类型转换实例分析

    这篇文章主要介绍了Java基本数据类型与类型转换,结合实例形式分析了Java基本数据类型分类、用法,类型转换及相关操作注意事项,需要的朋友可以参考下
    2020-04-04
  • SpringBoot整合Freemarker实现页面静态化的详细步骤

    SpringBoot整合Freemarker实现页面静态化的详细步骤

    这篇文章主要介绍了SpringBoot整合Freemarker实现页面静态化,第一步要创建项目添加依赖,本文分步骤给大家详细讲解,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • SpringBoot整合mybatisplus和druid的示例详解

    SpringBoot整合mybatisplus和druid的示例详解

    这篇文章主要介绍了SpringBoot整合mybatisplus和druid的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Java 认识异常并掌握使用

    Java 认识异常并掌握使用

    所谓异常是指程序在运行时出现错误时提示调用者的机制,异常的种类有很多,不同种类的异常有不同的含义,也有不同的处理方式,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • Java开发SSM框架微信支付的实现

    Java开发SSM框架微信支付的实现

    这篇文章主要介绍了Java开发SSM框架微信支付的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 对Java中JSON解析器的一些见解

    对Java中JSON解析器的一些见解

    这篇文章主要是对Java中JSON解析器的一些见解。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-12-12
  • Java中LinkedHashSet、LinkedHashMap源码详解

    Java中LinkedHashSet、LinkedHashMap源码详解

    这篇文章主要介绍了Java中LinkedHashSet、LinkedHashMap源码详解,LinkedHashMap是一个以双向链表的方式将Entry节点链接起来的HashMap子类,它在HashMap的基础上实现了更多的功能,具有顺序存储和遍历的特性,需要的朋友可以参考下
    2023-09-09
  • Java使用正则表达式删除所有HTML标签的方法示例

    Java使用正则表达式删除所有HTML标签的方法示例

    这篇文章主要介绍了Java使用正则表达式删除所有HTML标签的方法,结合完整实例形式分析了java针对HTML页面元素script标签、style标签、html标签等的正则匹配相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • SpringBoot多数据源配置的全过程记录

    SpringBoot多数据源配置的全过程记录

    在用SpringBoot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面这篇文章主要给大家介绍了关于SpringBoot多数据源配置的相关资料,需要的朋友可以参考下
    2021-11-11

最新评论