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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值