From a13874d8a58db3b3b710272c8883c0deb1004ce5 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 30 Jan 2021 13:17:03 +0100 Subject: [PATCH] Add missing overloads for client disconnect. Add timeout for disconnect in managed client. --- .../ManagedMqttClient.cs | 15 ++++++++---- .../MqttClientDisconnectOptions.cs | 2 +- Source/MQTTnet/Client/MqttClientExtensions.cs | 23 ++++++++++++------- .../MqttNetScopedLoggerExtensions.cs | 5 ++++ 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs b/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs index 23105748..931326bc 100644 --- a/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs +++ b/Source/MQTTnet.Extensions.ManagedClient/ManagedMqttClient.cs @@ -53,11 +53,11 @@ namespace MQTTnet.Extensions.ManagedClient public bool IsConnected => InternalClient.IsConnected; public bool IsStarted => _connectionCancellationToken != null; - + public IMqttClient InternalClient { get; } public int PendingApplicationMessagesCount => _messageQueue.Count; - + public IManagedMqttClientOptions Options { get; private set; } public IMqttClientConnectedHandler ConnectedHandler @@ -92,7 +92,7 @@ namespace MQTTnet.Extensions.ManagedClient if (options == null) throw new ArgumentNullException(nameof(options)); if (options.ClientOptions == null) throw new ArgumentException("The client options are not set.", nameof(options)); - + if (!_maintainConnectionTask?.IsCompleted ?? false) throw new InvalidOperationException("The managed client is already started."); Options = options; @@ -292,7 +292,14 @@ namespace MQTTnet.Extensions.ManagedClient { try { - await InternalClient.DisconnectAsync().ConfigureAwait(false); + using (var disconnectTimeout = new CancellationTokenSource(Options.ClientOptions.CommunicationTimeout)) + { + await InternalClient.DisconnectAsync(disconnectTimeout.Token).ConfigureAwait(false); + } + } + catch (OperationCanceledException) + { + _logger.Warning("Timeout while sending DISCONNECT packet."); } catch (Exception exception) { diff --git a/Source/MQTTnet/Client/Disconnecting/MqttClientDisconnectOptions.cs b/Source/MQTTnet/Client/Disconnecting/MqttClientDisconnectOptions.cs index 995806e7..f9fdf288 100644 --- a/Source/MQTTnet/Client/Disconnecting/MqttClientDisconnectOptions.cs +++ b/Source/MQTTnet/Client/Disconnecting/MqttClientDisconnectOptions.cs @@ -1,6 +1,6 @@ namespace MQTTnet.Client.Disconnecting { - public class MqttClientDisconnectOptions + public sealed class MqttClientDisconnectOptions { public MqttClientDisconnectReason ReasonCode { get; set; } = MqttClientDisconnectReason.NormalDisconnection; diff --git a/Source/MQTTnet/Client/MqttClientExtensions.cs b/Source/MQTTnet/Client/MqttClientExtensions.cs index 2408a14a..e9fd4361 100644 --- a/Source/MQTTnet/Client/MqttClientExtensions.cs +++ b/Source/MQTTnet/Client/MqttClientExtensions.cs @@ -128,7 +128,21 @@ namespace MQTTnet.Client { if (client == null) throw new ArgumentNullException(nameof(client)); - return client.DisconnectAsync(new MqttClientDisconnectOptions()); + return client.DisconnectAsync(CancellationToken.None); + } + + public static Task DisconnectAsync(this IMqttClient client, MqttClientDisconnectOptions options) + { + if (client == null) throw new ArgumentNullException(nameof(client)); + + return client.DisconnectAsync(options, CancellationToken.None); + } + + public static Task DisconnectAsync(this IMqttClient client, CancellationToken cancellationToken) + { + if (client == null) throw new ArgumentNullException(nameof(client)); + + return client.DisconnectAsync(new MqttClientDisconnectOptions(), cancellationToken); } public static Task SubscribeAsync(this IMqttClient client, params MqttTopicFilter[] topicFilters) @@ -176,13 +190,6 @@ namespace MQTTnet.Client return client.ConnectAsync(options, CancellationToken.None); } - public static Task DisconnectAsync(this IMqttClient client, MqttClientDisconnectOptions options) - { - if (client == null) throw new ArgumentNullException(nameof(client)); - - return client.DisconnectAsync(options, CancellationToken.None); - } - public static Task SendExtendedAuthenticationExchangeDataAsync(this IMqttClient client, MqttExtendedAuthenticationExchangeData data) { if (client == null) throw new ArgumentNullException(nameof(client)); diff --git a/Source/MQTTnet/Diagnostics/MqttNetScopedLoggerExtensions.cs b/Source/MQTTnet/Diagnostics/MqttNetScopedLoggerExtensions.cs index abb019fa..8ecc94c1 100644 --- a/Source/MQTTnet/Diagnostics/MqttNetScopedLoggerExtensions.cs +++ b/Source/MQTTnet/Diagnostics/MqttNetScopedLoggerExtensions.cs @@ -18,6 +18,11 @@ namespace MQTTnet.Diagnostics { logger.Publish(MqttNetLogLevel.Warning, message, parameters, exception); } + + public static void Warning(this IMqttNetScopedLogger logger, string message, params object[] parameters) + { + logger.Publish(MqttNetLogLevel.Warning, message, parameters, null); + } public static void Error(this IMqttNetScopedLogger logger, Exception exception, string message, params object[] parameters) {