RabbitMQ 发送消息 绕过系统配置的 消息转换器方法

1. 背景

我负责的系统需要与其他系统交互,需要我将消息发送到 MQ 上,其他系统监听消息。

遇到问题,两个系统的发送消息格式都是不一致的,所以这个地方是需要协商打通的。

目前这个系统经我查阅发现用的 fastjson 的 jsonb 序列化数据的(将 Java 对象转为 byte\[\])。

jsonb具体怎么序列化,网上也没查到。又考虑到其他语言对接的话可能不支持该序列化方式,所以,还是将本次与其他系统交互用的 MQ 单独换成简单通用的 JSON 字符串。

2. 解决方法

所以问题来了,系统目前已经集成好了, 都是用的 JSONB,这也是统一的配置。如何实现就这个MQ单独发一个 JSON 字符串出去呢。

起初想的是再弄一套配置,也就是 rabbitmqTemplate,这套配置就不配 JSON 的消息转换器了。

不过说起来很简单,改造起来并不容易。所以还是回到问题原点思考,就是要解决最初的那一个原因,就是要单独这个消息不经过消息转换器。

所以,直接就是看发送消息的源码,convertAndSend 方法,这里具体是哪里使用到了配置的消息转换器,消息转换器何时何以参加?

这里的 object 是发送时传的消息体。

下方又有一个 convertMessageIfNecessary 转换消息。

也就是说,如果传的消息直接就是 Message 类型,那么就直接返回了。不再走下面的消息转换了。

所以代码便可以如此写

经过我的测试,发现消息确实发送的是 JOSN 字符串了。

3. 其他理解

所以消息转换器的意义此时也更加深刻,消息转换器就是序列化方式,描述 byte\[\] 和 Java 对象之间的转化方法。

为何要使用消息转换器呢

  1. 可以自定义序列化协议,数据更安全,因为别人拿到消息也解析不出来了。

  2. 可以自己选择一个序列化协议,站在 RabbitMQ 框架来说,它是可配置的,不是强绑死的,这样,如果以后有了新的协议,用户无需关注 RabbitMQ,只需要将它配进来即可。

相关推荐
叶总没有会11 小时前
RabbitMQ高级
分布式·rabbitmq
ABB自动化15 小时前
ABB 500CIM06 (1MRB150077R0111) | REB500 通信接口
大数据·分布式·系统架构·系统安全·模块测试·plc 控制器
ZENERGY-众壹15 小时前
告别本地工控机:分布式光伏 SCADA 架构如何实现云边协同
分布式·架构·光伏运维·能源数字化·电站监控
code_slave(码畜)15 小时前
微服务架构落地:读写分离架构 —— 主从延迟引发的“刚开单查不到”灾难与破局
spring boot·分布式·spring cloud·微服务·云原生·架构·读写分离
JAVA_AI人工智能项目实战17 小时前
分布式大模型训练_学习笔记
人工智能·分布式·语言模型·自然语言处理
星夜孤帆17 小时前
Redis缓存击穿与分布式锁实战:专栏目录、源码与实验说明
redis·分布式·缓存
yyk3332418 小时前
Spark介绍
大数据·分布式·spark
成为你的宁宁18 小时前
【基于 SSH 与 JNLP 协议的 Jenkins 分布式构建方案】
分布式·jenkins
PingCAP1 天前
善战者无赫赫之功:消费金融核心系统的数据库选型与升级路径
数据库·分布式·架构
库库的数据库笔记1 天前
金融核心交易系统的数据库国产信创改造该如何做?
大数据·数据库·分布式·mysql·oracle·金融·数据库架构