On 30/03/17 09:52, Daniel Pocock wrote:
Sending to RabbitMQ with qpid-proton python
-------------------------------------------

I started with the simple_send.py[3] example and trimmed it down to send
a single string and then stop:

    def on_sendable(self, event):
        if self.msg_body is not None:
            print("on_sendable !")
            print ("sending : %s" % (self.msg_body,))
            msg = Message(body=self.msg_body)
            event.sender.send(msg)
            self.msg_body = None

I found that the connection to RabbitMQ would be dropped and an error
would appear in the RabbitMQ log.  I tried changing the body type to a
dict containing a string, e.g. {'my_body':'foo'} and then it would
successfully pass the message to RabbitMQ but then the receiver would
complain that it was a map and not a string.

I found that the problem could be fixed by adding "inferred=True" to the
Message constructor:

            msg = Message(body=self.msg_body, inferred=True)


The python proton library will encode a binary message body as a Data section if inferred is not set to true (otherwise as a binary value in a Value section). RabbitMQ does not support Data sections yet I believe.

As Robbie mentioned, in python 2.x string literals are not always explicitly utf8 and are then treated as binary. You can either do u'my utf8' or import unicode_literals from __future__. If you do that then you should get a Value section regardless of the inferred property.

Below is a complete example of the error from the RabbitMQ log when
inferred=True is not present, the body in this case was the string "foo"


Receiving from RabbitMQ with qpid-proton C++
--------------------------------------------

I looked at the receive example simple_recv.cpp[4] and other examples
and noticed code like this being used to access the message body as
std::string:

proton::get<std::string>(m.body())

However, that didn't work for me, it threw a conversion_error exception
"unexpected type, want: string got: binary" complaining that the body
was binary.  I had to use something like this to convert my message body
to a std::string:

   proton::binary __b = proton::get<proton::binary>(m.body());
   std::string _s = (std::string)__b;

If I send a string from Python, should it appear as binary in the
receiver?

As above it sounds like the message *is* actually being sent as a binary.

What is the suggested way to write a receiver that can handle
any arbitrary message that started as a string and may arrive in some
other format, especially if the message broker or client is changed at
some arbitrary time in the future?

I also observed similar issues receiving messages that had been sent
into RabbitMQ by Kamailio's kazoo module[5], it is linked with the
librabbitmq client library.

I'm assuming that is sending over AMQP 0-10. If so, how that is converted into AMQP 1.0 is dependent on the RabbitMQ implementation. It may well be always sent as a binary value. However hopefully it would have a content-type to indicate how to interpret the data (though structly speaking the AMQP 1.0 spec disallows that).


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to