RabbitMQ消息转换器

2023-10-27

RabbitMQ消息转换器

在这里插入图片描述
在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的对象,我们这里先把监听服务关掉。

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

    @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上面看一下接收到的消息:
在这里插入图片描述
这里,我们可以看到,我们的content_type的值是 application/x-java-serialized-object (Java序列化对象)。

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

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

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

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

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

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.10</version>
</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,而消息的可读性也变高了,细心的小伙伴应该也可以看到,这里需要的字节数也变少了。
在这里插入图片描述
然后我们重新启动我们的消费者服务,再次观察结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RabbitMQ消息转换器 的相关文章

  • java.lang.NoClassDefFoundError:org.apache.batik.dom.svg.SVGDOMImplementation

    我在链接到我的 Android LibGDX 项目的 Apache Batik 库时遇到了奇怪的问题 但让我们从头开始 在 IntelliJ Idea 中我有一个项目 其中包含三个模块 Main Android 和 Desktop 我强调的
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐

  • Linux开发

    目录 Linux开发工具 Linux编辑器 vim使用 1 vim的基本概念 2 vim的基本操作 3 vim正常模式命令集 4 vim末行模式命令集 Linux编译器 gcc g 使用 1 背景知识 2 gcc如何完成 Linux调试器
  • 把连续动态bmp转换为avi 分类: 文件格式 ...

    把动态bmp24转换为avi BYTE tmp buf 1024 768 4 生成avi void BMPtoAVI CString szAVIName CString strBmpDir CFileFind finder strBmpDi
  • 项目实训涉及的获取数据库数据,导出生成Excel表格(使用Nutz框架)

    前提要连接自己的数据库 java bean 就不写出来了 Service层 导出数据到Excel param ids return public boolean exportMeeting Integer ids List
  • matlab:sin函数

    可以发现sin pi 或者cos 1 2 pi 不等于0 初步推测应该是浮点运算的精度问题 由于sin cos tan等输入的参数为弧度制 而一般习惯角度制 所以解决的办法之一是用另外的函数 sind cosd tand等输入参数为角度制
  • Golang首字母大小写的意义(import package解析)

    1 大写相当于public 2 小写相当于private 注意 这个public和private是相对于包 go文件首行的package 后面跟的包名 来说的 3 1这个包名相对于它所处的实际的文件系统目录有什么关系呢 有关系 一般这个包名
  • Pycharm中文字体变成繁体解决方法

    文章目录 引言 原因分析 解决问题 引言 最近用pycharm的时候发现输入中文时字体突然变成繁体了 试了网上各种方式没有解决 最后发现是程序字体的问题 原因分析 因为是打代码 pycharm用的是英文字体 英文字体也可以打中文 但是一般会
  • 专升本——英语基础知识二

    八大成分 主语 谓语 宾语 定语 状语 补语 同位语 一 主语 动作的发起者 I love you I 是代词 代词做主语 The dog is cute The dog 是名词 名词做主语 Seven is my lucky Seven是
  • SimpleDateFormat时间不正确的问题

    开发遇到一个问题 new Date 获得的当前系统时间和经过SimpleDateFormat转换格式的时间不对应 相差一个小时 Date now new Date System out println now SimpleDateForma
  • Linux中将2块新增硬盘合并成一块,并挂载目录

    1 创建pv pvcreate dev sdb 硬盘1 pvcreate dev sdc 硬盘2 2 创建vg vgcreate 自定义LVM名称 硬盘 先使用硬盘1创建vg lvm data vgcreate lvm data dev s
  • RPM软件包管理与使用详解

    文章目录 1 概述 2 软件包命名规范 3 rpm包管理 3 1 rpm包安装 3 2 rpm包查询 3 3 rpm包升级 3 4 rpm包卸载 3 5 rpm包校验 3 6 rpm数据库重建 1 概述 什么是rpm包 rpm包是linux
  • 【VS

    1 CRT SECURE NO WARNINGS include
  • 小程序的 生命周期回调函数onLoad,onReady,onShow

    onLoad 只触发一次 页面加载时触发 从二级页面回来时不会触发 使用navigateBack 回跳是可以重新执行onLoad 以及tabBar首次会执行onload 第二次进入onload不会执行 可以传递参数 onShow 当小程序启
  • Jupyter Notebook的简单使用

    欢迎来到机器学习的世界 博客主页 卿云阁 欢迎关注 点赞 收藏 留言 本文由卿云阁原创 本阶段属于练气阶段 希望各位仙友顺利完成突破 首发时间 2021年3月3日 希望可以和大家一起完成进阶之路 作者水平很有限 如果发现错误 请留言轰炸哦
  • 虚拟机Ubuntu20.04 网络连接器图标开机不显示怎么办

    执行以下指令 sudo service network manager stop sudo rm var lib NetworkManager NetworkManager state sudo service network manage
  • Vue3的Teleport是什么?

    首先 Vue3的Teleport是一种魔法般的功能 它可以让你的组件瞬间移动到另一个位置 就像是现实生活中的瞬间传送器一样 但是它只适用于Vue3哦 你可能会想 这不是和Vue2的插槽差不多吗 NO NO NO 你可错了 Teleport和
  • JavaScript中的异步编程

    当我们在编写JavaScript代码时 经常会遇到需要执行长时间运行的任务的情况 例如从服务器获取数据或进行复杂的计算 在这些情况下 我们不希望阻塞用户界面 因为这会使网站看起来卡顿 甚至无响应 为了避免这种情况 我们需要使用JavaScr
  • js正则验证大全(你想要的这里都有)

    原文地址 https w55776 blog csdn net article details 125967169 去除html标签使用场景 不去除的样式展示 this stationList data map item gt const
  • 若干经典基础算法题目练习

    练习1 判断是否为素数 ConsoleAppIsPrime1 cpp 定义控制台应用程序的入口点 函数功能 判断一个输入的数是否为素数 函数原形 bool Prime int x 参数 int x 将要判断的数 返回值 bool型变量 判断
  • MySQL错误日志(Error Log)详解

    错误日志 Error Log 是 MySQL 中最常用的一种日志 主要记录 MySQL 服务器启动和停止过程中的信息 服务器在运行过程中发生的故障和异常情况等 作为初学者 要学会利用错误日志来定位问题 下面介绍如何操作查看错误日志 启动和设
  • RabbitMQ消息转换器

    文章目录 RabbitMQ消息转换器 RabbitMQ消息转换器 在SpringAMQP的发送方法中 发送消息和接受消息的类型都是Object 也就是说 我们可以发送任意对象类型的消息 SpringAMQP都会帮我们把发送的消息序列化为字节