服务异步通信-消息转换器

发布于:2023-09-22 ⋅ 阅读:(86) ⋅ 点赞:(0)

请添加图片描述
个人名片:

博主酒徒ᝰ.
个人简介沉醉在酒中,借着一股酒劲,去拼搏一个未来。
本篇励志三人行,必有我师焉。

请添加图片描述
本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 点击观看

三、SpringAMQP

6.消息转换器

在Spring AMQP中,消息转换器是一种重要的组件,用于处理消息的序列化和反序列化。Spring AMQP支持多种消息格式,如JSON、XML等,因此需要使用消息转换器将消息在生产者和消费者之间进行转换。

在Spring AMQP中,通常使用MessageConverter接口来实现消息转换器。Spring AMQP提供了几种默认的消息转换器,如StringMessageConverter、MappingJackson2MessageConverter、XmlMessageConverter等。

在Spring AMQP中使用消息转换器的作用:

  • 实现消息的序列化和反序列化:在RabbitMQ中,生产者需要将对象转换成消息写入消息队列,消费者需要将消息转换回对象进行读取。因此,通过消息转换器,可以实现对象和消息之间的相互转换。
  • 支持多种消息格式:Spring AMQP默认提供了多种消息转换器,如用于处理JSON格式的MappingJackson2MessageConverter,以及处理XML格式的XmlMessageConverter等。这意味着Spring
    AMQP可以支持多种消息格式,从而满足不同的业务需求。
  • 提高代码的可维护性和可读性:使用消息转换器,可以将对象的序列化和反序列化逻辑从业务代码中分离出来,封装到一个单独的类中。这样做可以提高代码的可维护性和可读性,因为序列化和反序列化的逻辑被抽取到了一个专门的类中,便于后续的修改和维护。
  • 简化开发过程:通过使用消息转换器,开发者可以不用关心底层的序列化和反序列化细节,只需要关注业务逻辑即可。这可以大大简化开发过程,提高开发效率。

因此,在Spring AMQP中使用消息转换器的主要作用是实现消息的序列化和反序列化,支持多种消息格式,提高代码的可维护性和可读性,以及简化开发过程。

测试发送Object类型消息

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

我们在consumer中利用@Bean声明一个队列:

@Bean
public Queue objectQueue(){
    return new Queue("object.queue");
}

在publisher中发送消息以测试:

@Test
public void testObject() {
    String queueName = "object.queue";
    Map<String, Object> map = new HashMap<>();
    map.put("name", "jack");
    map.put("age", 2);
    rabbitTemplate.convertAndSend(queueName, map);
}

消息转换器

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

如果要修改只需要定义一个MessageConverter 类型的Bean即可。推荐用JSON方式序列化,步骤如下:
因为publisher和consumer都需要Json依赖,所有我们在父类服务引入依赖

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

我们在publisher服务声明MessageConverter:

@Bean
public MessageConverter jsonMessageConverter() {
    return new Jackson2JsonMessageConverter();
}

我们在consumer服务定义MessageConverter:

@Bean
public MessageConverter jsonMessageConverter() {
    return new Jackson2JsonMessageConverter();
}

然后定义一个消费者,监听object.queue队列并消费消息:

@RabbitListener(queues = "object.queue")
public void listenObjectQueue(Map<String, Object> message){
    System.out.println("Object消息是" + message);
}

在这里插入图片描述

总结:

SpringAMQP中消息的序列化和反序列化是怎么实现的?
利用MessageConverter实现的,默认是JDK的序列化
注意发送方与接收方必须使用相同的MessageConverter

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到