Exemple #1
0
        public async Task<ReceivingAmqpLink> CreateReceivingLinkAsync(
            string path,
            IotHubConnectionString connectionString,
            string corrId,
            ReceivingLinkType linkType,
            uint prefetchCount,
            TimeSpan timeout,
            ProductInfo productInfo,
            CancellationToken cancellationToken)
        {
            this.OnCreateReceivingLink(connectionString);

            var timeoutHelper = new TimeoutHelper(timeout);

            AmqpSession session = await this.GetSessionAsync(timeoutHelper, cancellationToken).ConfigureAwait(false);

            var linkAddress = this.BuildLinkAddress(connectionString, path);

            var linkSettings = new AmqpLinkSettings()
            {
                Role = true,
                TotalLinkCredit = prefetchCount,
                AutoSendFlow = prefetchCount > 0,
                Source = new Source() { Address = linkAddress.AbsoluteUri },
                LinkName = Guid.NewGuid().ToString("N") // Use a human readable link name to help with debuggin
            };

            switch (linkType)
            {
                // Exactly once
                case ReceivingLinkType.C2DMessages:
                    linkSettings.SndSettleMode = null; // SenderSettleMode.Unsettled (null as it is the default and to avoid bytes on the wire)
                    linkSettings.RcvSettleMode = (byte)ReceiverSettleMode.Second;
                    break;

                // At least once
                case ReceivingLinkType.Events:
                    linkSettings.SndSettleMode = null; // SenderSettleMode.Unsettled (null as it is the default and to avoid bytes on the wire)
                    linkSettings.RcvSettleMode = (byte)ReceiverSettleMode.First;
                    break;

                // At most once
                case ReceivingLinkType.Methods:
                case ReceivingLinkType.Twin:
                    linkSettings.SndSettleMode = (byte)SenderSettleMode.Settled;
                    linkSettings.RcvSettleMode = (byte)ReceiverSettleMode.First;
                    break;
            }

            SetLinkSettingsCommonProperties(linkSettings, timeoutHelper.RemainingTime(), productInfo);
            if (linkType == ReceivingLinkType.Methods)
            {
                SetLinkSettingsCommonPropertiesForMethod(linkSettings, corrId);
            }
            else if (linkType == ReceivingLinkType.Twin)
            {
                SetLinkSettingsCommonPropertiesForTwin(linkSettings, corrId);
            }

            var link = new ReceivingAmqpLink(linkSettings);
            link.AttachTo(session);

            var audience = this.BuildAudience(connectionString, path);
            await this.OpenLinkAsync(link, connectionString, audience, timeoutHelper.RemainingTime(), cancellationToken).ConfigureAwait(false);

            return link;
        }
Exemple #2
0
        protected static AmqpLinkSettings SetLinkSettingsCommonProperties(AmqpLinkSettings linkSettings, TimeSpan timeSpan, ProductInfo productInfo)
        {
            linkSettings.AddProperty(IotHubAmqpProperty.TimeoutName, timeSpan.TotalMilliseconds);

            linkSettings.AddProperty(IotHubAmqpProperty.ClientVersion, productInfo.ToString());

            return linkSettings;
        }
        public async Task <SendingAmqpLink> CreateSendingLinkAsync(
            string path,
            IotHubConnectionString connectionString,
            string corrId,
            SendingLinkType linkType,
            TimeSpan timeout,
            ProductInfo productInfo,
            CancellationToken cancellationToken)
        {
            try
            {
                if (Logging.IsEnabled)
                {
                    Logging.Enter(this, corrId, linkType, $"{nameof(IotHubConnection)}.{nameof(CreateSendingLinkAsync)}");
                }

                this.OnCreateSendingLink(connectionString);

                var timeoutHelper = new TimeoutHelper(timeout);

                AmqpSession session = await this.GetSessionAsync(timeoutHelper, cancellationToken).ConfigureAwait(false);

                var linkAddress = this.BuildLinkAddress(connectionString, path);

                var linkSettings = new AmqpLinkSettings()
                {
                    Role = false,
                    InitialDeliveryCount = 0,
                    Target = new Target()
                    {
                        Address = linkAddress.AbsoluteUri
                    },
                    LinkName = Guid.NewGuid().ToString("N") // Use a human readable link name to help with debugging
                };

                switch (linkType)
                {
                case SendingLinkType.TelemetryEvents:
                    linkSettings.SndSettleMode = null;     // SenderSettleMode.Unsettled (null as it is the default and to avoid bytes on the wire)
                    linkSettings.RcvSettleMode = null;     // (byte)ReceiverSettleMode.First (null as it is the default and to avoid bytes on the wire)
                    break;

                case SendingLinkType.Methods:
                case SendingLinkType.Twin:
                    linkSettings.SndSettleMode = (byte)SenderSettleMode.Settled;
                    linkSettings.RcvSettleMode = (byte)ReceiverSettleMode.First;
                    break;
                }

                SetLinkSettingsCommonProperties(linkSettings, timeoutHelper.RemainingTime(), productInfo);
                if (linkType == SendingLinkType.Methods)
                {
                    SetLinkSettingsCommonPropertiesForMethod(linkSettings, corrId);
                }
                else if (linkType == SendingLinkType.Twin)
                {
                    SetLinkSettingsCommonPropertiesForTwin(linkSettings, corrId);
                }

                var link = new SendingAmqpLink(linkSettings);
                link.AttachTo(session);

                var audience = this.BuildAudience(connectionString, path);
                await this.OpenLinkAsync(link, connectionString, audience, timeoutHelper.RemainingTime(), cancellationToken).ConfigureAwait(false);

                return(link);
            }
            finally
            {
                if (Logging.IsEnabled)
                {
                    Logging.Exit(this, corrId, linkType, $"{nameof(IotHubConnection)}.{nameof(CreateSendingLinkAsync)}");
                }
            }
        }