Exemple #1
0
        internal async Task <AmqpIoTOutcome> SendMessageAsync(Message message, TimeSpan timeout)
        {
            if (Logging.IsEnabled)
            {
                Logging.Enter(this, message, $"{nameof(SendMessageAsync)}");
            }

            AmqpMessage amqpMessage = AmqpIoTMessageConverter.MessageToAmqpMessage(message);
            Outcome     outcome     = await SendAmqpMessageAsync(amqpMessage, timeout).ConfigureAwait(false);

            if (Logging.IsEnabled)
            {
                Logging.Exit(this, message, $"{nameof(SendMessageAsync)}");
            }

            return(new AmqpIoTOutcome(outcome));
        }
        internal async Task <Message> ReceiveAmqpMessageAsync(TimeSpan timeout)
        {
            if (Logging.IsEnabled)
            {
                Logging.Enter(this, $"{nameof(ReceiveAmqpMessageAsync)}");
            }

            try
            {
                AmqpMessage amqpMessage = await _receivingAmqpLink.ReceiveMessageAsync(timeout).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)}");
                }
            }
        }
Exemple #3
0
        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);
            }

            AmqpIoTOutcome amqpIoTOutcome = new AmqpIoTOutcome(outcome);

            if (amqpIoTOutcome != null)
            {
                amqpIoTOutcome.ThrowIfNotAccepted();
            }

            if (Logging.IsEnabled)
            {
                Logging.Exit(this, $"{nameof(SendMessagesAsync)}");
            }

            return(amqpIoTOutcome);
        }
        private void OnDeviceMessageReceived(AmqpMessage amqpMessage)
        {
            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
            {
                Logging.Exit(this, amqpMessage, $"{nameof(OnDeviceMessageReceived)}");
            }
        }
Exemple #5
0
        internal async Task <AmqpIoTOutcome> SendMessageAsync(Message message, TimeSpan timeout)
        {
            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, timeout).ConfigureAwait(false);

            if (Logging.IsEnabled)
            {
                Logging.Exit(this, message, $"{nameof(SendMessageAsync)}");
            }

            return(new AmqpIoTOutcome(outcome));
        }
Exemple #6
0
        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));
        }
Exemple #7
0
 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)}");
         }
     }
 }
Exemple #8
0
 private void OnEventsReceived(AmqpMessage amqpMessage)
 {
     if (Logging.IsEnabled)
     {
         Logging.Enter(this, amqpMessage, $"{nameof(OnEventsReceived)}");
     }
     try
     {
         Message message = AmqpIoTMessageConverter.AmqpMessageToMessage(amqpMessage);
         message.LockToken = new Guid(amqpMessage.DeliveryTag.Array).ToString();
         _onEventsReceived?.Invoke(message);
     }
     finally
     {
         if (Logging.IsEnabled)
         {
             Logging.Exit(this, amqpMessage, $"{nameof(OnMethodReceived)}");
         }
     }
 }
Exemple #9
0
        internal async Task <Message> ReceiveAmqpMessageAsync(TimeSpan timeout)
        {
            if (Logging.IsEnabled)
            {
                Logging.Enter(this, $"{nameof(ReceiveAmqpMessageAsync)}");
            }

            var amqpMessage = await _receivingAmqpLink.ReceiveMessageAsync(timeout).ConfigureAwait(false);

            Message message = null;

            if (amqpMessage != null)
            {
                message           = AmqpIoTMessageConverter.AmqpMessageToMessage(amqpMessage);
                message.LockToken = new Guid(amqpMessage.DeliveryTag.Array).ToString();
            }

            if (Logging.IsEnabled)
            {
                Logging.Exit(this, $"{nameof(ReceiveAmqpMessageAsync)}");
            }

            return(message);
        }