RabbitMQ消息转换器

文章目录

  • RabbitMQ消息转换器

RabbitMQ消息转换器

RabbitMQ消息转换器_第1张图片
在SpringAMQP的发送方法中,发送消息和接受消息的类型都是Object,也就是说,我们可以发送任意对象类型的消息,SpringAMQP都会帮我们把发送的消息序列化为字节后再进行发送。下面,我们可以演示一下:

假设我们现在有个User类,如下(切记一定要实现Serializable接口,才能被jdk序列化和反序列化):

@Data
public class User implements Serializable {
    private String name;
    private Integer age;
    private Date birthday;
}

然后我们在监听服务中注册一个名为 “object.queue” 的队列。

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

然后启动我们的监听服务,可以看到,在RabbitMq上已经可以看到我们刚才新建的队列了:
RabbitMQ消息转换器_第2张图片
为了观察我们发送到RabbitMQ的对象,我们这里先把监听服务关掉。

然后我们编写一个发送消息的测试方法如下:

    @Test
    public void testObject(){
        //接受的队列名称
        String queueName = "object.queue";
        //新建对象
        User user = new User();
        user.setName("张三");
        user.setAge(1);
        user.setBirthday(new Date());
        
        rabbitTemplate.convertAndSend(queueName, user);
    }

编写完成后,我们运行该方法。然后,我们到rabbitMq上面看一下接收到的消息:
RabbitMQ消息转换器_第3张图片
这里,我们可以看到,我们的content_type的值是 application/x-java-serialized-object (Java序列化对象)。

此时,我们启动我们的监听服务,可以接收到消息如下:
在这里插入图片描述

上面我们虽然也可以成功发送和接收对线,但是默认的基于JDK做的序列化存在下列问题

  • 数据体积过大
  • 有安全漏洞
  • 可读性差

因此,我们正常使用的情况下,我们不会使用默认的JDK的序列化,而是会用我们的JSON转换器

这里说明一下:Spring的队列消息对象的处理是由 MessageConverter 来处理的,而默认实现是 SimpleMessageConverter,该类基于 JDK 的 ObjectOutputStream 完成序列化。
如果我们在我们的配置类中,注册一个 MessageConverter 类型的 Bean 即可。推荐使用 JSON 方式序列化,步骤如下:
发送服务接收服务 中都引入我们的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.dataformatgroupId>
    <artifactId>jackson-dataformat-xmlartifactId>
    <version>2.9.10version>
dependency>

然后,我们在 发送服务接收服务 的启动类中添加我们的Bean如下:
这里返回的 MessageConverter 必须是amqp包下的 MessageConverter。(import org.springframework.amqp.support.converter.MessageConverter

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

为了看我们发送到rabbitMq的消息的形式,这里,我们还是把消费者服务先停掉,然后重新运行我们刚才发送User对象的测试方法。

发送成功后,我们获取我们的Message可以看到,此时的content_type是 application/json,而消息的可读性也变高了,细心的小伙伴应该也可以看到,这里需要的字节数也变少了。
RabbitMQ消息转换器_第4张图片
然后我们重新启动我们的消费者服务,再次观察结果如下:
在这里插入图片描述

你可能感兴趣的:(RabbitMQ,java-rabbitmq,rabbitmq,java)