userMod2
userMod2

Reputation: 8960

RabbitMQ - Send a JSON message

I send the following message with content type application/json:

enter image description here

However whene i get messages from the same RabbitMQ Web console, it shows the payload as String.

enter image description here

What am I doing wrong? Or am I fundamentally misunderstanding and the Payload is always of type String?

Upvotes: 20

Views: 72508

Answers (4)

jaxkewl
jaxkewl

Reputation: 213

from here

Content Type and Encoding

The content (MIME media) type and content encoding fields allow publishers communicate how message payload should be deserialized and decoded by consumers.

RabbitMQ does not validate or use these fields, it exists for applications and plugins to use and interpret.

by the way, using the rabbitMQ web gui, you use the words content_type, however in code (javascript confirmed), you use the key name contentType. it's a subtle difference, but enough to drive you crazy.

Upvotes: 2

Rakibul Haq
Rakibul Haq

Reputation: 1398

From NodeJS Context:


If we want to send JSON object as message, we may get the following error:

The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of Object

So, we can convert the JSON payload as string and parse it in the worker. We stringify the JSON object before sending the data the Queue-

let payloadAsString = JSON.stringify(payload);

And from worker's end, we can then JSON.parse

let payload = JSON.parse(msg.content.toString());
//then access the object as we normally do, i.e. :
let id = payload.id;

Upvotes: 17

Holland Risley
Holland Risley

Reputation: 6781

For anyone using .Net to send objects via RabbitMQ.

You have to serialise your JSON object to byte array, send via RabbitMQ then de-serialise after receiving. You can do this like this:

Install the Newtonsoft JSON library

using Newtonsoft.Json;

Create a model for your JSON object message (in this case AccountMessage)

Serialise your object into byte array like this:

 byte[] messagebuffer = Encoding.Default.GetBytes(JsonConvert.SerializeObject(accountMessage) );

After receiving the message data, you can de-serialise like this:

AccountMessage receivedMessage = JsonConvert.DeserializeObject<AccountMessage>(Encoding.UTF8.GetString(body));

Upvotes: 5

Alex Buyny
Alex Buyny

Reputation: 3185

From the official docs:

AMQP messages also have a payload (the data that they carry), which AMQP brokers treat as an opaque byte array. The broker will not inspect or modify the payload. It is possible for messages to contain only attributes and no payload. It is common to use serialisation formats like JSON, Thrift, Protocol Buffers and MessagePack to serialize structured data in order to publish it as the message payload. AMQP peers typically use the "content-type" and "content-encoding" fields to communicate this information, but this is by convention only.

So basically, RabbitMQ has no knowledge on JSON, messages all are just byte arrays to it

Upvotes: 34

Related Questions