Esempio n. 1
0
    def __init__(self,
                 body=None,
                 properties=None,
                 application_properties=None,
                 annotations=None,
                 header=None,
                 msg_format=None,
                 message=None,
                 settler=None,
                 delivery_no=None,
                 encoding='UTF-8'):
        self.state = constants.MessageState.WaitingToBeSent
        self.idle_time = 0
        self.retries = 0
        self._response = None
        self._settler = None
        self._encoding = encoding
        self._delivery_no = delivery_no
        self.on_send_complete = None
        self.properties = None
        self.application_properties = None
        self.annotations = None
        self.header = None
        self.footer = None
        self.delivery_annotations = None

        if message:
            if settler:
                self.state = constants.MessageState.ReceivedUnsettled
                self._response = None
            else:
                self.state = constants.MessageState.ReceivedSettled
                self._response = errors.MessageAlreadySettled()
            self._settler = settler
            self._parse_message(message)
        else:
            self._message = c_uamqp.create_message()
            if isinstance(body, (bytes, str)):
                self._body = DataBody(self._message)
                self._body.append(body)
            elif isinstance(body, list) and all(
                [isinstance(b, (bytes, str)) for b in body]):
                self._body = DataBody(self._message)
                for value in body:
                    self._body.append(value)
            elif isinstance(body, list):
                self._body = SequenceBody(self._message)
                for value in body:
                    self._body.append(value)
            else:
                self._body = ValueBody(self._message)
                self._body.set(body)
            if msg_format:
                self._message.message_format = msg_format
            self.properties = properties
            self.application_properties = application_properties
            self.annotations = annotations
            self.header = header
    def __init__(self,
                 body=None,
                 properties=None,
                 application_properties=None,
                 annotations=None,
                 header=None,
                 msg_format=None,
                 message=None,
                 settler=None,
                 delivery_no=None,
                 encoding='UTF-8',
                 body_type=None,
                 footer=None,
                 delivery_annotations=None):
        self.state = constants.MessageState.WaitingToBeSent
        self.idle_time = 0
        self.retries = 0
        self._response = None
        self._settler = None
        self._encoding = encoding
        self.delivery_no = delivery_no
        self.delivery_tag = None
        self.on_send_complete = None
        self._properties = None
        self._application_properties = None
        self._annotations = None
        self._header = None
        self._footer = None
        self._delivery_annotations = None
        self._need_further_parse = False

        if message:
            if settler:
                self.state = constants.MessageState.ReceivedUnsettled
                self._response = None
            else:
                self.state = constants.MessageState.ReceivedSettled
                self._response = errors.MessageAlreadySettled()
            self._settler = settler
            self._parse_message_body(message)
        else:
            self._message = c_uamqp.create_message()
            # if body_type is not given, we detect the body type by checking the type of the object
            if not body_type:
                self._auto_set_body(body)
            else:
                self._set_body_by_body_type(body, body_type)

            if msg_format:
                self._message.message_format = msg_format
            self._properties = properties
            self._application_properties = application_properties
            self._annotations = annotations
            self._delivery_annotations = delivery_annotations
            self._header = header
            self._footer = footer
Esempio n. 3
0
    def _on_message_sent(self, message, result, delivery_state=None):
        """Callback run on a message send operation. If message
        has a user defined callback, it will be called here. If the result
        of the operation is failure, the message state will be reverted
        to 'pending' up to the maximum retry count.

        :param message: The message that was sent.
        :type message: ~uamqp.message.Message
        :param result: The result of the send operation.
        :type result: int
        :param error: An Exception if an error ocurred during the send operation.
        :type error: ~Exception
        """
        # pylint: disable=protected-access
        exception = delivery_state
        result = constants.MessageSendResult(result)
        if result == constants.MessageSendResult.Error:
            if isinstance(delivery_state, Exception):
                exception = errors.ClientMessageError(delivery_state,
                                                      info=delivery_state)
                exception.action = errors.ErrorAction(retry=True)
            elif delivery_state:
                error = errors.ErrorResponse(delivery_state)
                exception = errors._process_send_error(self._error_policy,
                                                       error.condition,
                                                       error.description,
                                                       error.info)
            else:
                exception = errors.MessageSendFailed(
                    constants.ErrorCodes.UnknownError)
                exception.action = errors.ErrorAction(retry=True)
            if exception.action.retry == errors.ErrorAction.retry and message.retries < self._error_policy.max_retries:
                if exception.action.increment_retries:
                    message.retries += 1
                self._backoff = exception.action.backoff
                _logger.debug(
                    "Message error, retrying. Attempts: %r, Error: %r",
                    message.retries, exception)
                message.state = constants.MessageState.WaitingToBeSent
                return
            if exception.action.retry == errors.ErrorAction.retry:
                _logger.info("Message error, %r retries exhausted. Error: %r",
                             message.retries, exception)
            else:
                _logger.info("Message error, not retrying. Error: %r",
                             exception)
            message.state = constants.MessageState.SendFailed
            message._response = exception

        else:
            _logger.debug("Message sent: %r, %r", result, exception)
            message.state = constants.MessageState.SendComplete
            message._response = errors.MessageAlreadySettled()
        if message.on_send_complete:
            message.on_send_complete(result, exception)