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
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)