public async Task ExecuteAsync(string clientId, IPacket input, IMqttChannel <IPacket> channel)
        {
            if (input.Type != MqttPacketType.Disconnect)
            {
                return;
            }

            await Task.Run(() =>
            {
                Disconnect disconnect = input as Disconnect;

                _tracer.Info(ServerProperties.DisconnectFlow_Disconnecting(clientId));

                _willRepository.Delete(clientId);

                ClientSession session = _sessionRepository.Read(clientId);

                if (session == null)
                {
                    throw new MqttException(ServerProperties.SessionRepository_ClientSessionNotFound(clientId));
                }

                if (session.Clean)
                {
                    _sessionRepository.Delete(session.Id);

                    _tracer.Info(ServerProperties.Server_DeletedSessionOnDisconnect(clientId));
                }

                _connectionProvider.RemoveConnection(clientId);
            });
        }