一文带你了解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只支持字节的序列化方式,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);
}
启动消费者模块可以看到控制台输出的结果:
来源:https://juejin.cn/post/7216942649068453945


猜你喜欢
- 本文实例为大家分享了Androidstudio调用摄像头拍照并保存照片的具体代码,供大家参考,具体内容如下首先在manifest.xmlns
- 一、前言Unity3D不仅仅可以开发游戏,还有非常多的开发方向,秉承着兴趣为先,将可以使用Unity制作的各种应用案例,分享如何进行开发,如
- 双向信号和竞赛(Two-Way Signaling and Races) Monitor.Pulse方法的一个重要特性是它是异步执
- 第一节 接口慨述接口(interface)用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语
- 单一职责原则:一个类,只有一个引起它变化的原因。为什么需要单一职责原则?如果一个类有多个原因要去修改它,那么修改一个功能时,可能会让其他功能
- 前提其实很多框架都是对另一个框架的封装,我们在学习类似的框架的时候,难免会进入误区,所以我们就应该对其进行总结归纳,对比。本文就是对hibe
- java语言里包含了许多对设计模式的直接支持,如command模式,agent模式,observer模式等。虽然java提供的对
- 一、问题说明偶然换了下spring boot的版本号,结果idea一直标红,报该父依赖一直找不到。但是当我查看引入的依赖时,版本号已经变成2
- 本文为大家分享了Android实现带动画效果的可点击展开TextView 制作代码,效果图: 收起(默认)效果:点击展开后的效果:源码: 布
- 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现;一、程序
- 我们在k8s集群成功搭建了Prometheus服务。今天,我们将在springboot2.x中使用prometheus记录指标。一、我们需要
- 之前的项目中,在Socket通信的时候需要传int类型的值,不过java中outputsteam貌似不能直接传int类型,只能传byte[]
- 正文将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要
- 目录一 . 前言二 . 流程梳理2.1 实例化创建2.1.1 doGetBean 入口2.1.2 doGetBean 补充节点2.1.3 A
- 目录创建线程管理线程销毁线程创建线程线程是通过扩展 Thread 类创建的。扩展的 Thread 类调用 Start() 方法来开
- 概述:堆排序是利用构建“堆”的方法确定具有最大值的数据元素,并把该元素与最后位置上的元素交换。可将任意一个由n个数据元素构成的序列按照(a1
- 一、认识AdapterViewFilpper AdapterViewFilpper 继承 了Adapte
- 此解决方案是针对window的,因为日志默认保存路径在C盘,linux忽略。学习RocketMQ过程中,总是出现com.alibaba.ro
- 前言我们知道,IOC是Spring的核心。它来负责控制对象的生命周期和对象间的关系。举个例子,我们如何来找对象的呢?常见的情况是,在路上要到
- 本文实例为大家分享了SpringBoot +Mail+FreeMarker发送邮件,供大家参考,具体内容如下通过spirngboot 自带的