Sync Qpid RPC fix from Oslo

A change had to be made in the Havana Qpid implementation that is
not entirely backwards compatible.  This change allows Grizzly to
receive messages in the new format.

Backport of change for bug 1175808

Change-Id: I6ab63c3fccf562aeeb793e09f057c66bc109ef41
This commit is contained in:
Ben Nemec 2013-06-18 17:11:33 +00:00
parent 9b38a4b4b7
commit a99cc45585
1 changed files with 19 additions and 0 deletions

View File

@ -69,6 +69,8 @@ qpid_opts = [
cfg.CONF.register_opts(qpid_opts)
JSON_CONTENT_TYPE = 'application/json; charset=utf8'
class ConsumerBase(object):
"""Consumer base class."""
@ -123,10 +125,27 @@ class ConsumerBase(object):
self.receiver = session.receiver(self.address)
self.receiver.capacity = 1
def _unpack_json_msg(self, msg):
"""Load the JSON data in msg if msg.content_type indicates that it
is necessary. Put the loaded data back into msg.content and
update msg.content_type appropriately.
A Qpid Message containing a dict will have a content_type of
'amqp/map', whereas one containing a string that needs to be converted
back from JSON will have a content_type of JSON_CONTENT_TYPE.
:param msg: a Qpid Message object
:returns: None
"""
if msg.content_type == JSON_CONTENT_TYPE:
msg.content = jsonutils.loads(msg.content)
msg.content_type = 'amqp/map'
def consume(self):
"""Fetch the message and pass it to the callback object"""
message = self.receiver.fetch()
try:
self._unpack_json_msg(message)
msg = rpc_common.deserialize_msg(message.content)
self.callback(msg)
except Exception: