public static Exception ToMessagingContractException(this AmqpMessage responseMessage, AmqpResponseStatusCode statusCode) { AmqpSymbol errorCondition = AmqpExceptionHelper.GetResponseErrorCondition(responseMessage, statusCode); var statusDescription = responseMessage.ApplicationProperties.Map[ManagementConstants.Response.StatusDescription] as string ?? errorCondition.Value; return(AmqpExceptionHelper.ToMessagingContractException(errorCondition.Value, statusDescription)); }
protected override async Task OnSendAsync(IEnumerable <BrokeredMessage> brokeredMessages) { TimeoutHelper timeoutHelper = new TimeoutHelper(this.OperationTimeout, true); using (AmqpMessage amqpMessage = AmqpMessageConverter.BrokeredMessagesToAmqpMessage(brokeredMessages, true)) { SendingAmqpLink amqpLink = null; try { amqpLink = await this.SendLinkManager.GetOrCreateAsync(timeoutHelper.RemainingTime()).ConfigureAwait(false); if (amqpLink.Settings.MaxMessageSize.HasValue) { ulong size = (ulong)amqpMessage.SerializedMessageSize; if (size > amqpLink.Settings.MaxMessageSize.Value) { // TODO: Add MessageSizeExceededException throw new NotImplementedException("MessageSizeExceededException: " + Resources.AmqpMessageSizeExceeded.FormatForUser(amqpMessage.DeliveryId.Value, size, amqpLink.Settings.MaxMessageSize.Value)); ////throw Fx.Exception.AsError(new MessageSizeExceededException( ////Resources.AmqpMessageSizeExceeded.FormatForUser(amqpMessage.DeliveryId.Value, size, amqpLink.Settings.MaxMessageSize.Value))); } } Outcome outcome = await amqpLink.SendMessageAsync(amqpMessage, this.GetNextDeliveryTag(), AmqpConstants.NullBinary, timeoutHelper.RemainingTime()).ConfigureAwait(false); if (outcome.DescriptorCode != Accepted.Code) { Rejected rejected = (Rejected)outcome; throw Fx.Exception.AsError(AmqpExceptionHelper.ToMessagingContractException(rejected.Error)); } } catch (Exception exception) { throw AmqpExceptionHelper.GetClientException(exception, amqpLink?.GetTrackingId()); } } }
async Task DisposeMessagesAsync(IEnumerable <Guid> lockTokens, Outcome outcome) { TimeoutHelper timeoutHelper = new TimeoutHelper(this.OperationTimeout, true); IList <ArraySegment <byte> > deliveryTags = this.ConvertLockTokensToDeliveryTags(lockTokens); ReceivingAmqpLink receiveLink = null; try { receiveLink = await this.ReceiveLinkManager.GetOrCreateAsync(timeoutHelper.RemainingTime()).ConfigureAwait(false); Task <Outcome>[] disposeMessageTasks = new Task <Outcome> [deliveryTags.Count]; int i = 0; foreach (ArraySegment <byte> deliveryTag in deliveryTags) { disposeMessageTasks[i++] = Task.Factory.FromAsync( (c, s) => receiveLink.BeginDisposeMessage(deliveryTag, outcome, true, timeoutHelper.RemainingTime(), c, s), a => receiveLink.EndDisposeMessage(a), this); } Outcome[] outcomes = await Task.WhenAll(disposeMessageTasks).ConfigureAwait(false); Error error = null; foreach (Outcome item in outcomes) { var disposedOutcome = item.DescriptorCode == Rejected.Code && ((error = ((Rejected)item).Error) != null) ? item : null; if (disposedOutcome != null) { if (error.Condition.Equals(AmqpErrorCode.NotFound)) { if (this.isSessionReceiver) { throw new SessionLockLostException(Resources.SessionLockExpiredOnMessageSession); } else { throw new MessageLockLostException(Resources.MessageLockLost); } } throw AmqpExceptionHelper.ToMessagingContractException(error); } } } catch (Exception exception) { if (exception is OperationCanceledException && receiveLink != null && receiveLink.State != AmqpObjectState.Opened) { if (this.isSessionReceiver) { throw new SessionLockLostException(Resources.SessionLockExpiredOnMessageSession); } else { throw new MessageLockLostException(Resources.MessageLockLost); } } throw AmqpExceptionHelper.GetClientException(exception); } }