我发送以下内容类型为application / json的消息:
但是,当我从同一个RabbitMQ Web控制台获取消息时,它会将有效负载显示为String。
我做错了什么?或者我是否从根本上误解了并且Payload始终是String类型的?
答案 0 :(得分:8)
来自官方docs:
AMQP消息还有一个有效载荷(它们携带的数据),AMQP代理将其视为不透明的字节数组。经纪人不会检查或修改有效载荷。消息可能只包含属性而没有有效负载。通常使用序列化格式(如JSON,Thrift,Protocol Buffers和MessagePack)来序列化结构化数据,以便将其作为消息有效负载发布。 AMQP对等体通常使用“内容类型”和“内容编码”字段来传达此信息,但这仅限于惯例。
所以基本上,RabbitMQ不了解JSON,消息都只是字节数组
答案 1 :(得分:4)
来自NodeJS
上下文:
如果要发送JSON对象作为消息,则可能会出现以下错误:
第一个参数必须是字符串类型或Buffer的实例, ArrayBuffer或Array或类似Array的对象。收到的实例 对象
因此,我们可以将JSON有效负载转换为字符串,并在worker中进行解析。在将数据发送到Queue-
之前,我们先对JSON对象进行字符串化 let payloadAsString = JSON.stringify(payload);
然后从工作人员的末端,我们可以进行JSON.parse
let payload = JSON.parse(msg.content.toString());
//then access the object as we normally do, i.e. :
let id = payload.id;
答案 2 :(得分:0)
对于使用.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));
答案 3 :(得分:0)
来自here
内容类型和编码
内容(MIME媒体)类型和内容编码字段使发布者可以传达消费者应如何反序列化和解码消息有效负载。
RabbitMQ不验证或使用这些字段,它存在供应用程序和插件使用和解释。
顺便说一句,使用rabbitMQ Web gui,使用单词 content_type ,但是在代码中(已确认javascript),使用键名 contentType 。这是一个微妙的差异,但足以使您发疯。