RabbitMQ - 发送JSON消息

use*_*od2 8 rabbitmq

我发送以下消息与内容类型application/json:

在此输入图像描述

但是,当我从同一个RabbitMQ Web控制台获取消息时,它会将有效负载显示为String.

在此输入图像描述

我究竟做错了什么?或者我从根本上误解了,Payload总是String类型?

Ale*_*yny 11

来自官方文档:

AMQP消息还具有有效载荷(它们携带的数据),AMQP代理将其视为不透明的字节数组.经纪人不会检查或修改有效载荷.消息可能只包含属性而没有有效负载.通常使用序列化格式(如JSON,Thrift,Protocol Buffers和MessagePack)来序列化结构化数据,以便将其作为消息有效负载发布.AMQP对等体通常使用"内容类型"和"内容编码"字段来传达此信息,但这仅限于惯例.

所以基本上,RabbitMQ不了解JSON,消息都只是字节数组

  • 问题是关于理解有效负载是什么,我回答了这个问题。我在这里没有看到任何问题。 (2认同)

Rak*_*Haq 10

NodeJS上下文:


如果我们想将 JSON 对象作为消息发送,我们可能会收到以下错误:

第一个参数必须是字符串类型或 Buffer、ArrayBuffer 或 Array 的实例或类似 Array 的对象。接收到一个 Object 实例

因此,我们可以将 JSON 有效负载转换为字符串并在工作程序中对其进行解析。我们在将数据发送到队列之前对 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;
Run Code Online (Sandbox Code Playgroud)


Hol*_*ley 5

对于任何使用 .Net 通过 RabbitMQ 发送对象的人。

您必须将 JSON 对象序列化为字节数组,通过 RabbitMQ 发送,然后在接收后反序列化。你可以这样做:

安装 Newtonsoft JSON 库

using Newtonsoft.Json;
Run Code Online (Sandbox Code Playgroud)

为您的 JSON 对象消息创建模型(在本例中为 AccountMessage)

将您的对象序列化为字节数组,如下所示:

 byte[] messagebuffer = Encoding.Default.GetBytes(JsonConvert.SerializeObject(accountMessage) );
Run Code Online (Sandbox Code Playgroud)

收到消息数据后,可以这样反序列化:

AccountMessage receivedMessage = JsonConvert.DeserializeObject<AccountMessage>(Encoding.UTF8.GetString(body));
Run Code Online (Sandbox Code Playgroud)

  • 我在搜索如何在 Rabbit MQ 中发送对象时发现了这个问题,我使用.Net,所以其他人可能会找到我在这里发现有用的解决方案。 (6认同)