code: def handle_single_message(self, msg):
          
          job_id = msg.message['job_id']
          actual_msg = msg.message
          if msg.type == MessageType.JOB_UPDATED:
              progress = actual_msg['progress']
              total_progress = actual_msg['total_progress']
              self.storage_backend.update_job_progress(job_id, progress,
                                                       total_progress)
          elif msg.type == MessageType.JOB_COMPLETED:
              self.storage_backend.complete_job(job_id)
          elif msg.type == MessageType.JOB_FAILED:
              exc = actual_msg['exception']
              trace = actual_msg['traceback']
              self.storage_backend.mark_job_as_failed(job_id, exc, trace)
          elif msg.type == MessageType.JOB_CANCELED:
              self.storage_backend.mark_job_as_canceled(job_id)
          else:
              self.logger.error("Unknown message type: {}".format(msg.type))
docs: Handle one message and modify the job storage appropriately.
          :param msg: the message to handle
          :return: None