public CompletionPendingMessageState(int packetId, IQos2MessageDeliveryState deliveryState,
                                      PreciseTimeSpan startTimestamp, MessageFeedbackChannel feedbackChannel)
 {
     this.PacketId        = packetId;
     this.DeliveryState   = deliveryState;
     this.StartTimestamp  = startTimestamp;
     this.FeedbackChannel = feedbackChannel;
 }
 public CompletionPendingMessageState(int packetId, string lockToken,
                                      IQos2MessageDeliveryState deliveryState, PreciseTimeSpan startTimestamp)
 {
     this.PacketId       = packetId;
     this.LockToken      = lockToken;
     this.DeliveryState  = deliveryState;
     this.StartTimestamp = startTimestamp;
     this.SentTime       = DateTime.UtcNow;
 }
 public CompletionPendingMessageState(int packetId, string lockToken,
      IQos2MessageDeliveryState deliveryState, PreciseTimeSpan startTimestamp)
 {
     this.PacketId = packetId;
     this.LockToken = lockToken;
     this.DeliveryState = deliveryState;
     this.StartTimestamp = startTimestamp;
     this.SentTime = DateTime.UtcNow;
 }
 public CompletionPendingMessageState(int packetId, IQos2MessageDeliveryState deliveryState,
     PreciseTimeSpan startTimestamp, MessageFeedbackChannel feedbackChannel)
 {
     this.PacketId = packetId;
     this.DeliveryState = deliveryState;
     this.StartTimestamp = startTimestamp;
     this.FeedbackChannel = feedbackChannel;
     this.SentTime = DateTime.UtcNow;
 }
        Task PublishReleaseToClientAsync(IChannelHandlerContext context, int packetId, MessageFeedbackChannel feedbackChannel,
                                         IQos2MessageDeliveryState messageState, PreciseTimeSpan startTimestamp)
        {
            var pubRelPacket = new PubRelPacket();

            pubRelPacket.PacketId = packetId;
            return(this.pubRelPubCompProcessor.SendRequestAsync(context, pubRelPacket,
                                                                new CompletionPendingMessageState(packetId, messageState, startTimestamp, feedbackChannel)));
        }
Exemplo n.º 6
0
        Task PublishReleaseToClientAsync(IChannelHandlerContext context, int packetId, string lockToken,
                                         IQos2MessageDeliveryState messageState, PreciseTimeSpan startTimestamp)
        {
            var pubRelPacket = new PubRelPacket
            {
                PacketId = packetId
            };

            return(this.pubRelPubCompProcessor.SendRequestAsync(context, pubRelPacket,
                                                                new CompletionPendingMessageState(packetId, lockToken, messageState, startTimestamp)));
        }
        static TableMessageDeliveryState ValidateMessageType(IQos2MessageDeliveryState message)
        {
            var tableMessage = message as TableMessageDeliveryState;

            if (tableMessage == null)
            {
                throw new ArgumentException(string.Format("Message is of unexpected type `{0}`. Only messages created through {1}.Create() method are supported",
                                                          message.GetType().Name, typeof(TableQos2StatePersistenceProvider).Name));
            }
            return(tableMessage);
        }
        public Task DeleteMessageAsync(int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);

            if (tableMessage.ETag == null)
            {
                throw new ArgumentException("Transient message cannot be deleted.");
            }

            return this.table.ExecuteAsync(TableOperation.Delete(tableMessage));
        }
        public Task DeleteMessageAsync(IDeviceIdentity deviceIdentity, int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);

            if (tableMessage.ETag == null)
            {
                throw new ArgumentException("Transient message cannot be deleted.");
            }

            return(this.table.ExecuteAsync(TableOperation.Delete(tableMessage)));
        }
        async Task AcknowledgePublishReceiveAsync(IChannelHandlerContext context, AckPendingMessageState message)
        {
            this.ResumeReadingIfNecessary(context);

            // todo: is try-catch needed here?
            try
            {
                IQos2MessageDeliveryState messageInfo = this.qos2StateProvider.Create(message.SequenceNumber);
                await this.qos2StateProvider.SetMessageAsync(this.identity, message.PacketId, messageInfo);

                await this.PublishReleaseToClientAsync(context, message.PacketId, message.FeedbackChannel, messageInfo, message.StartTimestamp);
            }
            catch (Exception ex)
            {
                ShutdownOnError(context, "-> PUBREC", ex);
            }
        }
        public Task SetMessageAsync(int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);
            TableOperation            tableOperation;

            if (tableMessage.ETag == null)
            {
                tableMessage.PartitionKey = CalculatePartitionKey(packetId);
                tableMessage.RowKey       = packetId.ToString(CultureInfo.InvariantCulture);
                tableOperation            = TableOperation.Insert(tableMessage);
            }
            else
            {
                tableOperation = TableOperation.Replace(tableMessage);
            }
            return(this.table.ExecuteAsync(tableOperation));
        }
        public Task SetMessageAsync(IDeviceIdentity deviceIdentity, int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);
            TableOperation            tableOperation;

            if (tableMessage.ETag == null)
            {
                string rowKey = CalculateRowKey(deviceIdentity.Id, packetId);
                tableMessage.PartitionKey = CalculatePartitionKey(rowKey);
                tableMessage.RowKey       = rowKey;
                tableOperation            = TableOperation.Insert(tableMessage);
            }
            else
            {
                tableOperation = TableOperation.Replace(tableMessage);
            }
            return(this.table.ExecuteAsync(tableOperation));
        }
Exemplo n.º 13
0
        async Task PublishToClientQos2Async(IChannelHandlerContext context, IMessage message, PublishPacket packet)
        {
            int packetId = packet.PacketId;
            IQos2MessageDeliveryState messageInfo = await this.qos2StateProvider.GetMessageAsync(this.identity, packetId);

            if (messageInfo != null && message.SequenceNumber != messageInfo.SequenceNumber)
            {
                await this.qos2StateProvider.DeleteMessageAsync(this.identity, packetId, messageInfo);

                messageInfo = null;
            }

            if (messageInfo == null)
            {
                await this.publishPubRecProcessor.SendRequestAsync(context, packet, new AckPendingMessageState(message, packet));
            }
            else
            {
                await this.PublishReleaseToClientAsync(context, packetId, message.LockToken, messageInfo, PreciseTimeSpan.FromStart);
            }
        }
        async Task PublishToClientQos2Async(IChannelHandlerContext context, Message message, PublishPacket packet)
        {
            int packetId = packet.PacketId;
            IQos2MessageDeliveryState messageInfo = await this.qos2StateProvider.GetMessageAsync(packetId);

            if (messageInfo != null && !message.MessageId.Equals(messageInfo.MessageId, StringComparison.Ordinal))
            {
                await this.qos2StateProvider.DeleteMessageAsync(packetId, messageInfo);

                messageInfo = null;
            }

            if (messageInfo == null)
            {
                await this.publishPubRecProcessor.SendRequestAsync(context, packet, new AckPendingMessageState(message, packet));
            }
            else
            {
                await this.PublishReleaseToClientAsync(context, packetId, message.LockToken, messageInfo, PreciseTimeSpan.FromStart);
            }
        }
        async Task PublishToClientQos2Async(IChannelHandlerContext context, IMessage message, IMessagingSource callback, PublishPacket packet)
        {
            await Qos2Semaphore.WaitAsync(this.lifetimeCancellation.Token); // this ensures proper ordering of messages

            Task deliveryTask;

            try
            {
                int packetId = packet.PacketId;
                IQos2MessageDeliveryState messageInfo = await this.qos2StateProvider.GetMessageAsync(this.identity, packetId);

                if (messageInfo != null && message.SequenceNumber != messageInfo.SequenceNumber)
                {
                    await this.qos2StateProvider.DeleteMessageAsync(this.identity, packetId, messageInfo);

                    messageInfo = null;
                }

                if (messageInfo == null)
                {
                    deliveryTask = this.publishPubRecProcessor.SendRequestAsync(context, packet,
                                                                                new AckPendingMessageState(message, callback, packet));
                }
                else
                {
                    deliveryTask = this.PublishReleaseToClientAsync(context, packetId, new MessageFeedbackChannel(message.Id, callback), messageInfo, PreciseTimeSpan.FromStart);
                }
            }
            finally
            {
                try
                {
                    this.Qos2Semaphore.Release();
                }
                catch (ObjectDisposedException)
                { }
            }

            await deliveryTask;
        }
        async Task AcknowledgePublishReceiveAsync(IChannelHandlerContext context, AckPendingMessageState message)
        {
            this.ResumeReadingIfNecessary(context);

            // todo: is try-catch needed here?
            try
            {
                IQos2MessageDeliveryState messageInfo = this.qos2StateProvider.Create(message.MessageId);
                await this.qos2StateProvider.SetMessageAsync(message.PacketId, messageInfo);

                await this.PublishReleaseToClientAsync(context, message.PacketId, message.LockToken, messageInfo, message.StartTimestamp);

                if (this.publishPubRecProcessor.ResumeRetransmission(context))
                {
                    return;
                }

                this.RestartReceiveIfPossible(context);
            }
            catch (Exception ex)
            {
                ShutdownOnError(context, "-> PUBREC", ex);
            }
        }
 static TableMessageDeliveryState ValidateMessageType(IQos2MessageDeliveryState message)
 {
     var tableMessage = message as TableMessageDeliveryState;
     if (tableMessage == null)
     {
         throw new ArgumentException(string.Format("Message is of unexpected type `{0}`. Only messages created through {1}.Create() method are supported",
             message.GetType().Name, typeof(TableQos2StatePersistenceProvider).Name));
     }
     return tableMessage;
 }
        public Task SetMessageAsync(IDeviceIdentity deviceIdentity, int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);
            TableOperation tableOperation;
            if (tableMessage.ETag == null)
            {
                string rowKey = CalculateRowKey(deviceIdentity.Id, packetId);
                tableMessage.PartitionKey = CalculatePartitionKey(rowKey);
                tableMessage.RowKey = rowKey;
                tableOperation = TableOperation.Insert(tableMessage);
            }
            else
            {
                tableOperation = TableOperation.Replace(tableMessage);
            }
            return this.table.ExecuteAsync(tableOperation);
        }
        public Task SetMessageAsync(int packetId, IQos2MessageDeliveryState message)
        {
            Contract.Requires(message != null);

            TableMessageDeliveryState tableMessage = ValidateMessageType(message);
            TableOperation tableOperation;
            if (tableMessage.ETag == null)
            {
                tableMessage.PartitionKey = CalculatePartitionKey(packetId);
                tableMessage.RowKey = packetId.ToString(CultureInfo.InvariantCulture);
                tableOperation = TableOperation.Insert(tableMessage);
            }
            else
            {
                tableOperation = TableOperation.Replace(tableMessage);
            }
            return this.table.ExecuteAsync(tableOperation);
        }
 Task PublishReleaseToClientAsync(IChannelHandlerContext context, int packetId, string lockToken,
     IQos2MessageDeliveryState messageState, PreciseTimeSpan startTimestamp)
 {
     var pubRelPacket = new PubRelPacket
     {
         PacketId = packetId
     };
     return this.pubRelPubCompProcessor.SendRequestAsync(context, pubRelPacket,
         new CompletionPendingMessageState(packetId, lockToken, messageState, startTimestamp));
 }