private void OnDeviceMessageReceived(AmqpMessage amqpMessage) { if (Logging.IsEnabled) { Logging.Enter(this, amqpMessage, nameof(OnDeviceMessageReceived)); } try { Message message = null; if (amqpMessage != null) { message = AmqpIotMessageConverter.AmqpMessageToMessage(amqpMessage); message.LockToken = new Guid(amqpMessage.DeliveryTag.Array).ToString(); } _onDeviceMessageReceived?.Invoke(message); } finally { if (Logging.IsEnabled) { Logging.Exit(this, amqpMessage, nameof(OnDeviceMessageReceived)); } } }
internal async Task <Message> ReceiveAmqpMessageAsync(CancellationToken cancellationToken) { if (Logging.IsEnabled) { Logging.Enter(this, nameof(ReceiveAmqpMessageAsync)); } try { AmqpMessage amqpMessage = await _receivingAmqpLink.ReceiveMessageAsync(cancellationToken).ConfigureAwait(false); Message message = null; if (amqpMessage != null) { message = AmqpIotMessageConverter.AmqpMessageToMessage(amqpMessage); message.LockToken = new Guid(amqpMessage.DeliveryTag.Array).ToString(); } return(message); } catch (Exception e) when(!e.IsFatal()) { Exception ex = AmqpIotExceptionAdapter.ConvertToIotHubException(e, _receivingAmqpLink); if (ReferenceEquals(e, ex)) { throw; } else { if (ex is AmqpIotResourceException) { _receivingAmqpLink.SafeClose(); throw new IotHubCommunicationException(ex.Message, ex); } throw ex; } } finally { if (Logging.IsEnabled) { Logging.Exit(this, nameof(ReceiveAmqpMessageAsync)); } } }
internal async Task <AmqpIotOutcome> SendMessageAsync(Message message, CancellationToken cancellationToken) { if (Logging.IsEnabled) { Logging.Enter(this, message, nameof(SendMessageAsync)); } // After this message is sent, we will return the outcome that has no references to the message // So it can safely be disposed. using AmqpMessage amqpMessage = AmqpIotMessageConverter.MessageToAmqpMessage(message); Outcome outcome = await SendAmqpMessageAsync(amqpMessage, cancellationToken).ConfigureAwait(false); if (Logging.IsEnabled) { Logging.Exit(this, message, nameof(SendMessageAsync)); } return(new AmqpIotOutcome(outcome)); }
internal async Task <AmqpIotOutcome> SendMethodResponseAsync(MethodResponseInternal methodResponse, TimeSpan timeout) { if (Logging.IsEnabled) { Logging.Enter(this, methodResponse, nameof(SendMethodResponseAsync)); } using AmqpMessage amqpMessage = AmqpIotMessageConverter.ConvertMethodResponseInternalToAmqpMessage(methodResponse); AmqpIotMessageConverter.PopulateAmqpMessageFromMethodResponse(amqpMessage, methodResponse); Outcome outcome = await SendAmqpMessageAsync(amqpMessage, timeout).ConfigureAwait(false); if (Logging.IsEnabled) { Logging.Exit(this, nameof(SendMethodResponseAsync)); } return(new AmqpIotOutcome(outcome)); }
internal async Task <AmqpIotOutcome> SendMethodResponseAsync(MethodResponseInternal methodResponse, CancellationToken cancellationToken) { if (Logging.IsEnabled) { Logging.Enter(this, methodResponse, nameof(SendMethodResponseAsync)); } cancellationToken.ThrowIfCancellationRequested(); using AmqpMessage amqpMessage = AmqpIotMessageConverter.ConvertMethodResponseInternalToAmqpMessage(methodResponse); AmqpIotMessageConverter.PopulateAmqpMessageFromMethodResponse(amqpMessage, methodResponse); Outcome outcome = await SendAmqpMessageAsync(amqpMessage, cancellationToken).ConfigureAwait(false); if (Logging.IsEnabled) { Logging.Exit(this, nameof(SendMethodResponseAsync)); } return(new AmqpIotOutcome(outcome)); }
internal async Task <AmqpIotOutcome> SendMessagesAsync(IEnumerable <Message> messages, TimeSpan timeout) { if (Logging.IsEnabled) { Logging.Enter(this, nameof(SendMessagesAsync)); } // List to hold messages in AMQP friendly format var messageList = new List <Data>(); foreach (Message message in messages) { using AmqpMessage amqpMessage = AmqpIotMessageConverter.MessageToAmqpMessage(message); var data = new Data { Value = AmqpIotMessageConverter.ReadStream(amqpMessage.ToStream()), }; messageList.Add(data); } Outcome outcome; using (AmqpMessage amqpMessage = AmqpMessage.Create(messageList)) { amqpMessage.MessageFormat = AmqpConstants.AmqpBatchedMessageFormat; outcome = await SendAmqpMessageAsync(amqpMessage, timeout).ConfigureAwait(false); } var amqpIotOutcome = new AmqpIotOutcome(outcome); amqpIotOutcome.ThrowIfNotAccepted(); if (Logging.IsEnabled) { Logging.Exit(this, nameof(SendMessagesAsync)); } return(amqpIotOutcome); }
private void OnMethodReceived(AmqpMessage amqpMessage) { if (Logging.IsEnabled) { Logging.Enter(this, amqpMessage, nameof(OnMethodReceived)); } try { MethodRequestInternal methodRequestInternal = AmqpIotMessageConverter.ConstructMethodRequestFromAmqpMessage( amqpMessage, new CancellationToken(false)); DisposeDelivery(amqpMessage, true, AmqpConstants.AcceptedOutcome); _onMethodReceived?.Invoke(methodRequestInternal); } finally { if (Logging.IsEnabled) { Logging.Exit(this, amqpMessage, nameof(OnMethodReceived)); } } }
internal async Task <AmqpIotOutcome> SendMessagesAsync(IEnumerable <Message> messages, CancellationToken cancellationToken) { if (Logging.IsEnabled) { Logging.Enter(this, nameof(SendMessagesAsync)); } cancellationToken.ThrowIfCancellationRequested(); // List to hold messages in AMQP friendly format var messageList = new List <Data>(messages.Count()); foreach (Message message in messages) { using AmqpMessage amqpMessage = AmqpIotMessageConverter.MessageToAmqpMessage(message); var data = new Data { Value = AmqpIotMessageConverter.ReadStream(amqpMessage.ToStream()), }; messageList.Add(data); } using var batchMessage = AmqpMessage.Create(messageList); batchMessage.MessageFormat = AmqpConstants.AmqpBatchedMessageFormat; Outcome outcome = await SendAmqpMessageAsync(batchMessage, cancellationToken).ConfigureAwait(false); var amqpIotOutcome = new AmqpIotOutcome(outcome); amqpIotOutcome.ThrowIfNotAccepted(); if (Logging.IsEnabled) { Logging.Exit(this, nameof(SendMessagesAsync)); } return(amqpIotOutcome); }