public async Task <(bool Ok, string Message)> IsHealthOk(string queueName)
        {
            try
            {
                // Only way to check if connection string is correct is try receiving a message,
                // which isn't possible for topics as don't have a subscription
                AzureCore.IMessageReceiver receiver = _messageReceiverFactory.Receiver(queueName);
                IList <Message>            message  = await receiver.PeekAsync(1);

                await receiver.CloseAsync();

                return(await Task.FromResult((true, string.Empty)));
            }
            catch (ServiceBusCommunicationException ex)
            {
                return(false, ex.Message);
            }
        }
        protected async override Task ReceiveMessages <T>(string entityPath, Predicate <T> predicate, TimeSpan timeout)
        {
            List <T> messages = new List <T>();
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

            AzureCore.IMessageReceiver receiver = _messageReceiverFactory.Receiver(entityPath);

            _ = Task.Run(() =>
            {
                if (!cancellationTokenSource.Token.WaitHandle.WaitOne(timeout))
                {
                    _messageReceiverFactory.TimedOut();
                    cancellationTokenSource.Cancel();
                }
            });

            try
            {
                while (true)
                {
                    Message message = await receiver.ReceiveAsync(TimeSpan.FromSeconds(5));

                    try
                    {
                        if (message != null)
                        {
                            await receiver.CompleteAsync(message.SystemProperties.LockToken);

                            string json = null;

                            using (MemoryStream inputStream = new MemoryStream(message.Body))
                            {
                                using (StreamReader streamReader = new StreamReader(inputStream))
                                {
                                    json = streamReader.ReadToEnd();
                                }
                            }

                            T messageOfType = JsonConvert.DeserializeObject <T>(json);

                            if (predicate(messageOfType))
                            {
                                break;
                            }
                        }
                    }
                    catch (JsonSerializationException)
                    {
                        // don't do anything the serialization failed as this is not a message we are interested in
                    }

                    if (cancellationTokenSource.Token.IsCancellationRequested)
                    {
                        break;
                    }
                }
            }
            finally
            {
                // cancel timeout
                cancellationTokenSource.Cancel();
                await receiver.CloseAsync();
            }
        }