【问题标题】:RabbitMQ - Send a JSON messageRabbitMQ - 发送 JSON 消息
【发布时间】:2018-04-12 04:46:10
【问题描述】:

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

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

我做错了什么?还是我从根本上误解了 Payload 始终是 String 类型?

【问题讨论】:

    标签: rabbitmq


    【解决方案1】:

    来自官方docs

    AMQP 消息也有一个有效负载(它们携带的数据),AMQP 代理将其视为一个不透明的字节数组。代理不会检查或修改有效负载。消息可能只包含属性而不包含有效负载。通常使用 JSON、Thrift、Protocol Buffers 和 MessagePack 等序列化格式来序列化结构化数据,以便将其发布为消息有效负载。 AMQP 对等点通常使用“content-type”和“content-encoding”字段来传达此信息,但这只是惯例。

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

    【讨论】:

    • 下面这个答案更简洁:stackoverflow.com/a/60583488/5413849
    • 问题是关于理解什么是有效载荷,我回答了这个问题。我在这里没有看到任何问题。
    • 是的,但我发现另一个答案更简洁。说到重点。了解发生了什么没关系,但更重要的是知道如何解决问题
    【解决方案2】:

    来自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;
    

    【讨论】:

    • 这个对我有用,应该是公认的答案。
    【解决方案3】:

    适用于任何使用 .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));
    

    【讨论】:

    • 你为什么认为这个问题是关于 .NET 的?
    • 我在搜索如何在 Rabbit MQ 中发送对象时发现了这个问题,我使用 .Net,所以其他人可能会在这里找到我发现有用的解决方案。
    【解决方案4】:

    来自here

    内容类型和编码

    内容(MIME 媒体)类型和内容编码字段允许发布者传达消息有效负载应如何由消费者反序列化和解码。

    RabbitMQ 不会验证或使用这些字段,它的存在是供应用程序和插件使用和解释的。

    顺便说一下,使用rabbitMQ web gui,您使用单词content_type,但是在代码中(javascript确认),您使用键名contentType。这是一个微妙的区别,但足以让你发疯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多