code: def _request(self, resource, rtype, action=None, payload=None, offset=None, limit=None, requestId=None,
                   is_crud=False):
          
          end = self.__end
          if end.is_set():
              raise LinkShutdownException('Client stopped')
  
          rng = None
          if offset is not None and limit is not None:
              Validation.limit_offset_check(limit, offset)
              rng = "%d/%d" % (offset, limit)
          with self.__requests:
              if requestId is None:
                  requestId = self.__new_request_id()
              elif requestId in self.__requests:
                  raise ValueError('requestId %s already in use' % requestId)
              inner_msg = self.__make_innermsg(resource, rtype, requestId, action, payload, rng)
              self.__requests[requestId] = ret = RequestEvent(requestId, inner_msg, is_crud=is_crud)
          #
          if not self.__retry_enqueue(PreparedMessage(inner_msg, requestId)):
              raise LinkShutdownException('Client stopping')
          return ret
docs: _request amqp queue publish helper
  
          return: RequestEvent object or None for failed to publish