本文小编为大家详细介绍“RabbitMQ消息转换器怎么应用”,内容详细,步骤清晰,细节处理妥当,希望这篇“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;@Configurationpublic 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;@SpringBootApplicationpublic 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消息转换器怎么应用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。