当前位置: 首页 > article >正文

acitvemq AMQP:因为消息映射策略配置导致的MQTT接收JMS消息乱码问题 x-opt-jms-dest x-opt-jms-msg-type

使用ActiveMQ(5.14.5)作消息系统服务的场景下,
当我用Apache Qpid Proton发送消息(使用AMQP协议)发送JMS消息,用Paho MQTT接收消息的时候,
收到的消息前面总是有一串乱码,大概就是这样:

4Sp?ASr?)?x-opt-jms-destQ?x-opt-jms-msg-typeQSs?R topic://chat1@@@@@@??93-b243-fc0a073afe3

解决方案

为了方便读者快速找到解决办法,先说解决方案,
更新activemq的配置文件 $activemq_folder/conf/activemq.xml
如下图,为amqp协议连接URL增加transport.transformer=jms指定AMQP消息到JMS消息的转换策略(conversion strategies)
在这里插入图片描述
重启ActiveMQ服务就OK

AMQP 映射到 JMS

有三种基本的转换策略可以与 AMQP 一起使用,实现与 JMS API 互操作。

策略描述
native(默认)将 AMQP 消息的二进制数据封装到 JMS BytesMessage中,并将 AMQP 消息的标头映射到 JMS 消息上的标头。
raw将 AMQP 消息的二进制数据封装到 JMS BytesMessage中
jms将 AMQP 消息的标头映射到 JMS 消息标头,并将 AMQP 消息的正文映射到 JMS 正文。

通过在transportConnector上增加transport.transformer选项设置所需的映射策略。例如,要在有效负载级别与JMS进行互操作,请将transformer选项设置为jms

<transportConnector name="amqp" uri="amqp://localhost:5672?transport.transformer=jms"/>

参见 ActiveMQ关于AMQP协议的官方说明

https://activemq.apache.org/components/classic/documentation/amqp《Mapping to JMS》章节

当使用默认方式时(native)时,AMQP 消息的二进制数据封装到 JMS BytesMessage中,这进制数据库中不仅包括消息正文,还包括了保存在HashMap中的一些JMS消息的额外信息。如下图。
在这里插入图片描述
当在这些数据会与消息正文前面一起被序列化发送出去,就成了我们MQTT接收消息时看到的在正文前的一堆乱码。

测试代码

相关测试代码参见码云仓库:
AMQP发送单元测试:
https://gitee.com/l0km/simplemq/blob/master/simplemq-amqp/src/test/java/gu/simplemq/proton/ProtonPublisherTest.java
MQTT订阅单元测试:
https://gitee.com/l0km/simplemq/blob/master/simplemq-mqtt/src/test/java/gu/simplemq/mqtt/MqttSubscriberTest.java


http://www.kler.cn/a/456489.html

相关文章:

  • C语言 练习
  • NLP基础知识 - 向量化
  • AI安全的挑战:如何让人工智能变得更加可信
  • visual studio连接sql server数据库
  • LLMs之o3:《Deliberative Alignment: Reasoning Enables Safer Language Models》翻译与解读
  • Python爬虫 - 豆瓣电影排行榜数据爬取、处理与存储
  • 机器学习基本概念,基本步骤,分类,简单理解,线性模型
  • 【期末复习】JavaEE(下)
  • Arduino中借助LU-ASR01实现语音识别
  • Go语言基础语法
  • RNA-Seq 数据集、比对和标准化
  • 基于GA遗传优化TCN时间卷积神经网络时间序列预测算法matlab仿真
  • 【AIGC-ChatGPT副业提示词指令 - 动图】魔法咖啡馆:一个融合创意与治愈的互动体验设计
  • 总结一下本次使用docker部署遇到的问题
  • 【已解决】图片png转ico格式
  • 伏羲0.13(文生图)
  • 三极管、运放和稳压二极管恒流电路设计原理分析
  • Vue中接入萤石等直播视频(更新中ing)
  • 如何在Express.js中定义多个HTTP方法?
  • <packaging>jar</packaging>和<packaging>pom</packaging>的区别
  • nginx Rewrite 相关功能
  • fopen的概念和使用方法
  • 正则表达式 - 使用总结
  • 多个微服务 Mybatis 过程中出现了Invalid bound statement (not found)的特殊问题
  • 系统分析师案例分析100问
  • 【Leetcode 热题 100】78. 子集