软件编程
位置:首页>> 软件编程>> java编程>> 一文带你了解RabbitMQ消息转换器

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

作者:小威要向诸佬学习呀  发布时间:2023-11-15 23:22:28 

标签: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消息转换器

这是因为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();
   }
}

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

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

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

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

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

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

来源:https://juejin.cn/post/7216942649068453945

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com