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); } }
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); } } }
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(); }
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>()); }
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); }
private void Exec_CancelActiveCommand(object sender, EventArgs e) { KeepAliveMonitor.CancelAll(); }