class_docstr: This publisher will handle failures and closures and will
  attempt to restart things
  
  delivery confirmations are used to track messages that have
  been sent and if they have been confirmed
code: def dequeue(self, acknowledge=True, timeout=0):
      # start the consumer and allow single messages to returned via
      # this method to the caller blocking using a callback lock
      # while waiting
      for i in range(timeout + 1):
          with self._rmq_lock:
              if self._consumer is None and self._channel is not None:
                  self._consumer = self._channel.basic_consume(
                      self._queue, self._on_message
                  )
  
              if self._rmq_msg is not None:
                  self._logger.info(
                      "message %s from %s ", self._rmq_msg, self._url
                  )
                  rec_msg = self._rmq_msg
                  rec_id = self._rmq_id
                  if acknowledge:
                      self.acknowledge(self._rmq_id)
                  return rec_msg, rec_id
              self._logger.info("idle %s %s", self._url, self._queue)
  
          if i >= timeout:
              self._logger.info(
                  "timed-out trying to dequeue from %s", self._url
              )
              return None, None
  
          time.sleep(1)
  
      self._logger.debug("dequeue done from %s", self._url)
      return None, None
  
imports: import time
  import threading
  import pika
  from studio.storage.storage_setup import get_storage_verbose_level
  from studio.util import logs
label_desc: Use image node_id 30 for calling the RMQueue obj's underlying member method code with example usage: obj.dequeue(acknowledge, timeout) and returns: None,  None, None,  None, rec_msg,  rec_id