【发布时间】:2018-04-12 04:46:10
【问题描述】:
我发送以下消息,内容类型为 application/json:
但是,当我从同一个 RabbitMQ Web 控制台获取消息时,它会将有效负载显示为字符串。
我做错了什么?还是我从根本上误解了 Payload 始终是 String 类型?
【问题讨论】:
标签: rabbitmq
我发送以下消息,内容类型为 application/json:
但是,当我从同一个 RabbitMQ Web 控制台获取消息时,它会将有效负载显示为字符串。
我做错了什么?还是我从根本上误解了 Payload 始终是 String 类型?
【问题讨论】:
标签: rabbitmq
来自官方docs:
AMQP 消息也有一个有效负载(它们携带的数据),AMQP 代理将其视为一个不透明的字节数组。代理不会检查或修改有效负载。消息可能只包含属性而不包含有效负载。通常使用 JSON、Thrift、Protocol Buffers 和 MessagePack 等序列化格式来序列化结构化数据,以便将其发布为消息有效负载。 AMQP 对等点通常使用“content-type”和“content-encoding”字段来传达此信息,但这只是惯例。
所以基本上,RabbitMQ 不了解 JSON,消息都只是字节数组
【讨论】:
来自NodeJS 上下文:
如果我们想发送 JSON 对象作为消息,我们可能会得到以下错误:
第一个参数必须是字符串类型或Buffer的实例, ArrayBuffer,或数组或类似数组的对象。收到一个实例 对象
因此,我们可以将 JSON 有效负载转换为字符串并在 worker 中对其进行解析。我们在将数据发送到队列之前对 JSON 对象进行字符串化-
let payloadAsString = JSON.stringify(payload);
然后从worker端,我们可以JSON.parse
let payload = JSON.parse(msg.content.toString());
//then access the object as we normally do, i.e. :
let id = payload.id;
【讨论】:
适用于任何使用 .Net 通过 RabbitMQ 发送对象的人。
您必须将您的 JSON 对象序列化为字节数组,通过 RabbitMQ 发送,然后在接收后反序列化。你可以这样做:
安装 Newtonsoft JSON 库
using Newtonsoft.Json;
为您的 JSON 对象消息(在本例中为 AccountMessage)创建一个模型
将您的对象序列化为字节数组,如下所示:
byte[] messagebuffer = Encoding.Default.GetBytes(JsonConvert.SerializeObject(accountMessage) );
收到消息数据后,可以这样反序列化:
AccountMessage receivedMessage = JsonConvert.DeserializeObject<AccountMessage>(Encoding.UTF8.GetString(body));
【讨论】:
来自here
内容类型和编码
内容(MIME 媒体)类型和内容编码字段允许发布者传达消息有效负载应如何由消费者反序列化和解码。
RabbitMQ 不会验证或使用这些字段,它的存在是供应用程序和插件使用和解释的。
顺便说一下,使用rabbitMQ web gui,您使用单词content_type,但是在代码中(javascript确认),您使用键名contentType。这是一个微妙的区别,但足以让你发疯。
【讨论】: