protected override async Task <IList <BrokeredMessage> > OnReceiveAsync(int maxMessageCount, TimeSpan serverWaitTime) { ReceivingAmqpLink receiveLink = null; try { TimeoutHelper timeoutHelper = new TimeoutHelper(serverWaitTime, true); receiveLink = await this.ReceiveLinkManager.GetOrCreateAsync(timeoutHelper.RemainingTime()).ConfigureAwait(false); IEnumerable <AmqpMessage> amqpMessages = null; bool hasMessages = await Task.Factory.FromAsync( (c, s) => receiveLink.BeginReceiveRemoteMessages(maxMessageCount, AmqpMessageReceiver.DefaultBatchFlushInterval, timeoutHelper.RemainingTime(), c, s), a => receiveLink.EndReceiveMessages(a, out amqpMessages), this).ConfigureAwait(false); if (receiveLink.TerminalException != null) { throw receiveLink.TerminalException; } if (hasMessages && amqpMessages != null) { IList <BrokeredMessage> brokeredMessages = null; foreach (var amqpMessage in amqpMessages) { if (brokeredMessages == null) { brokeredMessages = new List <BrokeredMessage>(); } if (this.ReceiveMode == ReceiveMode.ReceiveAndDelete) { receiveLink.DisposeDelivery(amqpMessage, true, AmqpConstants.AcceptedOutcome); } BrokeredMessage brokeredMessage = AmqpMessageConverter.ClientGetMessage(amqpMessage); brokeredMessage.Receiver = this; // Associate the Message with this Receiver. brokeredMessages.Add(brokeredMessage); } return(brokeredMessages); } return(null); } catch (Exception exception) { throw AmqpExceptionHelper.GetClientException(exception, receiveLink?.GetTrackingId()); } }
protected override async Task <IList <EventData> > OnReceiveAsync(int maxMessageCount, TimeSpan waitTime) { bool shouldRetry; int retryCount = 0; var timeoutHelper = new TimeoutHelper(waitTime, true); do { shouldRetry = false; try { try { // Always use default timeout for AMQP sesssion. ReceivingAmqpLink receiveLink = await this.ReceiveLinkManager.GetOrCreateAsync( TimeSpan.FromSeconds(AmqpClientConstants.AmqpSessionTimeoutInSeconds)).ConfigureAwait(false); IEnumerable <AmqpMessage> amqpMessages = null; bool hasMessages = await Task.Factory.FromAsync( (c, s) => receiveLink.BeginReceiveMessages(maxMessageCount, timeoutHelper.RemainingTime(), c, s), a => receiveLink.EndReceiveMessages(a, out amqpMessages), this).ConfigureAwait(false); if (receiveLink.TerminalException != null) { throw receiveLink.TerminalException; } if (hasMessages && amqpMessages != null) { IList <EventData> eventDatas = null; foreach (var amqpMessage in amqpMessages) { if (eventDatas == null) { eventDatas = new List <EventData>(); } receiveLink.DisposeDelivery(amqpMessage, true, AmqpConstants.AcceptedOutcome); eventDatas.Add(AmqpMessageConverter.AmqpMessageToEventData(amqpMessage)); } return(eventDatas); } } catch (AmqpException amqpException) { throw AmqpExceptionHelper.ToMessagingContract(amqpException.Error); } } catch (Exception ex) { // Evaluate retry condition? TimeSpan?retryInterval = this.RetryPolicy.GetNextRetryInterval(ex, timeoutHelper.RemainingTime(), ++retryCount); if (retryInterval != null && !this.EventHubClient.IsClosed) { await Task.Delay(retryInterval.Value).ConfigureAwait(false); shouldRetry = true; } else { // Handle EventHubsTimeoutException explicitly. // We don't really want to to throw EventHubsTimeoutException on this call. if (ex is EventHubsTimeoutException) { break; } throw; } } } while (shouldRetry); // No messages to deliver. return(null); }
protected override async Task <IList <EventData> > OnReceiveAsync(int maxMessageCount, TimeSpan waitTime) { bool shouldRetry; var timeoutHelper = new TimeoutHelper(waitTime, true); do { shouldRetry = false; try { try { ReceivingAmqpLink receiveLink = await this.ReceiveLinkManager.GetOrCreateAsync(timeoutHelper.RemainingTime()).ConfigureAwait(false); IEnumerable <AmqpMessage> amqpMessages = null; bool hasMessages = await Task.Factory.FromAsync( (c, s) => receiveLink.BeginReceiveMessages(maxMessageCount, timeoutHelper.RemainingTime(), c, s), a => receiveLink.EndReceiveMessages(a, out amqpMessages), this).ConfigureAwait(false); if (receiveLink.TerminalException != null) { throw receiveLink.TerminalException; } this.EventHubClient.RetryPolicy.ResetRetryCount(this.ClientId); if (hasMessages && amqpMessages != null) { IList <EventData> eventDatas = null; foreach (var amqpMessage in amqpMessages) { if (eventDatas == null) { eventDatas = new List <EventData>(); } receiveLink.DisposeDelivery(amqpMessage, true, AmqpConstants.AcceptedOutcome); eventDatas.Add(AmqpMessageConverter.AmqpMessageToEventData(amqpMessage)); } return(eventDatas); } } catch (AmqpException amqpException) { throw AmqpExceptionHelper.ToMessagingContract(amqpException.Error); } } catch (Exception ex) { // Evaluate retry condition? this.EventHubClient.RetryPolicy.IncrementRetryCount(this.ClientId); TimeSpan?retryInterval = this.EventHubClient.RetryPolicy.GetNextRetryInterval(this.ClientId, ex, timeoutHelper.RemainingTime()); if (retryInterval != null) { await Task.Delay(retryInterval.Value).ConfigureAwait(false); shouldRetry = true; } else { throw; } } } while (shouldRetry); // No messages to deliver. return(null); }