code: def _get_consume_message(self, channel_info):
      LOGGER.debug(f"_get_comsume_message, channel_info={channel_info}")
      while True:
          response = channel_info.consume()
          # LOGGER.debug(f"_get_comsume_message, channel_info={channel_info}, response={response}")
          if response.code == "E0000000601":
              raise LookupError(f"{response}")
          message = osx_pb2.Message()
          message.ParseFromString(response.payload)
  
          head_str = str(message.head, encoding="utf-8")
          # LOGGER.debug(f"head str {head_str}")
          properties = json.loads(head_str)
          # LOGGER.debug(f"osx response properties {properties}")
          body = message.body
          yield 0, properties, body
  
imports: import json
  import typing
  from logging import getLogger
  from fate.arch.federation.api import PartyMeta
  from fate.arch.federation.backends.osx import osx_pb2
  from fate.arch.federation.message_queue import MessageQueueBasedFederation
  from ._mq_channel import MQChannel
label_desc: Use image node_id 7 for calling the OSXFederation obj's underlying member method code with example usage: obj._get_consume_message(channel_info) without return types