Пример #1
0
        private async Task ReceivePacketsAsync(IMqttChannelAdapter adapter, CancellationToken cancellationToken)
        {
            try
            {
                while (!cancellationToken.IsCancellationRequested)
                {
                    var packet = await adapter.ReceivePacketAsync(TimeSpan.Zero, cancellationToken).ConfigureAwait(false);

                    KeepAliveMonitor.PacketReceived(packet);
                    await ProcessReceivedPacketAsync(adapter, packet, cancellationToken).ConfigureAwait(false);
                }
            }
            catch (OperationCanceledException)
            {
            }
            catch (MqttCommunicationException exception)
            {
                _logger.Warning <MqttClientSession>(exception, "Client '{0}': Communication exception while processing client packets.", ClientId);
                await StopAsync().ConfigureAwait(false);
            }
            catch (Exception exception)
            {
                _logger.Error <MqttClientSession>(exception, "Client '{0}': Unhandled exception while processing client packets.", ClientId);
                await StopAsync().ConfigureAwait(false);
            }
        }
Пример #2
0
        public async Task StopAsync(bool wasCleanDisconnect = false)
        {
            try
            {
                if (_cancellationTokenSource == null)
                {
                    return;
                }

                _wasCleanDisconnect = wasCleanDisconnect;

                _cancellationTokenSource?.Cancel(false);

                PendingMessagesQueue.WaitForCompletion();
                KeepAliveMonitor.WaitForCompletion();

                _cancellationTokenSource?.Dispose();
                _cancellationTokenSource = null;

                _adapter = null;

                _logger.Info <MqttClientSession>("Client '{0}': Session stopped.", ClientId);
            }
            finally
            {
                var willMessage = _willMessage;
                _willMessage = null; // clear willmessage so it is send just once

                if (willMessage != null && !wasCleanDisconnect)
                {
                    await ApplicationMessageReceivedCallback(this, willMessage).ConfigureAwait(false);
                }
            }
        }
Пример #3
0
        public void ResetTest()
        {
            //Arrange
            var objKeepAliveTimer = Substitute.For <ITimer>();
            var objPingTimer      = Substitute.For <ITimer>();

            //Act
            var obj = new KeepAliveMonitor(objKeepAliveTimer, objPingTimer);

            obj.Reset();

            //Assert
            objKeepAliveTimer.Received(1).Reset();
            objPingTimer.Received(1).Stop();
        }
Пример #4
0
        public void TimeoutTest()
        {
            //Arrange
            var objKeepAliveTimer = Substitute.For <ITimer>();
            var objPingTimer      = Substitute.For <ITimer>();
            var objHandler        = Substitute.For <EventHandler>();
            var obj = new KeepAliveMonitor(objKeepAliveTimer, objPingTimer);

            obj.TimeOut += objHandler;

            //Act
            objKeepAliveTimer.Elapsed += Raise.Event <EventHandler>(obj, new EventArgs());

            //Assert
            objHandler
            .Received(1)
            .Invoke(Arg.Is(obj), Arg.Any <EventArgs>());
        }
Пример #5
0
        public async Task <bool> RunAsync(MqttConnectPacket connectPacket, IMqttChannelAdapter adapter)
        {
            if (connectPacket == null)
            {
                throw new ArgumentNullException(nameof(connectPacket));
            }
            if (adapter == null)
            {
                throw new ArgumentNullException(nameof(adapter));
            }

            try
            {
                var cancellationTokenSource = new CancellationTokenSource();

                _wasCleanDisconnect      = false;
                _willMessage             = connectPacket.WillMessage;
                _adapter                 = adapter;
                _cancellationTokenSource = cancellationTokenSource;

                PendingMessagesQueue.Start(adapter, cancellationTokenSource.Token);
                KeepAliveMonitor.Start(connectPacket.KeepAlivePeriod, cancellationTokenSource.Token);

                await ReceivePacketsAsync(adapter, cancellationTokenSource.Token).ConfigureAwait(false);
            }
            catch (OperationCanceledException)
            {
            }
            catch (MqttCommunicationException exception)
            {
                _logger.Warning <MqttClientSession>(exception, "Client '{0}': Communication exception while processing client packets.", ClientId);
            }
            catch (Exception exception)
            {
                _logger.Error <MqttClientSession>(exception, "Client '{0}': Unhandled exception while processing client packets.", ClientId);
            }

            return(_wasCleanDisconnect);
        }
Пример #6
0
 private void Exec_CancelActiveCommand(object sender, EventArgs e)
 {
     KeepAliveMonitor.CancelAll();
 }