<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def _request(self, resource, rtype, action=None, payload=None, offset=None, limit=None, requestId=None, is_crud=False):
 """_request amqp queue publish helper return: RequestEvent object or None for failed to publish """

        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