0

使用 Spring XD 的接收器 MQTT 源模块,我在有效负载上得到错误的值。我让流订阅了某个主题,而 Eclipse 中的普通客户端也订阅了相同的主题。有效载荷应该是一个字节数组。对于我收到的相同消息

xxxxx...0000073F,在 Spring XD 上

xxxxx...000007F9,在 Eclipse Paho 客户端上

实际上,这个值应该是一个计数器,并且 eclipse paho 客户端表现得很好,但是当任何十六进制数字达到 F 时,Spring XD 似乎表现得很奇怪。出于同样的原因,它会卡在同一个数字上,直到计数器已经增加到足以消除序列上的任何 F。

我的问题是,如果 Spring XD 上提供的 MQTT 客户端上发生任何预处理,这解释了为什么我在有效负载上得到不同的值。我确信第二个是正确的,因为发送值的是我自己。

谢谢。

4

1 回答 1

3

Spring XD 使用Spring Integration,它在后台使用 Paho 客户端。

不幸的是,它将有效负载转换为字符串(默认为 UTF-8),这会产生这样的结果,其中的数据不是有效的 UTF-8。

可以将适配器配置为以二进制形式传递有效负载,但遗憾的是,该选项当前未在 XD 中公开。

解决方法是创建一个子类DefaultPahoMessageConverter,覆盖mqttBytesToPayload...

protected Object mqttBytesToPayload(MqttMessage mqttMessage) throws Exception {
    return mqttMessage.getPayload();
}

将转换器放入模块lib目录中的 jar 中,并更新 mqtt.xml 以在converter属性中传递转换器的实例。

我将打开一个JIRA 问题以使二进制成为模块的标准选项。

于 2014-08-10T10:04:25.760 回答