public async Task BuildAndRunClients()
        {
            this.configuration = await ConfigurationParser.GetConfiguration(this.configFilePath);

            Console.WriteLine($"Working with the following Config: {JsonConvert.SerializeObject(this.configuration)}");
            Console.WriteLine(
                $"Creating {this.configuration.ClientCount} clients.");
            Console.WriteLine($"Test will take {this.configuration.ClientConfiguration.TestDurationInMinutes} minutes.");
            BrokerFactory         brokerFactory         = new BrokerFactory(this.configuration.BrokerConfiguration);
            MessageBuilderFactory messageBuilderFactory = new MessageBuilderFactory(this.configuration.MessageBuilderConfiguration);
            ClientFactory         clientFactory         = new ClientFactory(this.configuration.ClientConfiguration, brokerFactory, messageBuilderFactory);
            var clients = clientFactory.Create(this.configuration.ClientCount);

            List <Task> taskList = new List <Task>();

            foreach (var client in clients)
            {
                var clientTask = client.RunAsync();
                taskList.Add(clientTask);
            }
            try
            {
                Task.WaitAll(taskList.ToArray());
            }
            catch (AggregateException e)
            {
                for (int j = 0; j < e.InnerExceptions.Count; j++)
                {
                    Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString());
                }
            }
            Console.WriteLine($"Test ended.");
        }
        public static async Task <BrokerTesterBaseConfiguration> GetConfiguration(string configFilePath)
        {
            string configurationString = await File.ReadAllTextAsync(configFilePath);

            JObject job = JObject.Parse(configurationString);

            if (!job.ContainsKey(BrokerConfigurationProperty))
            {
                throw new Exception($"{BrokerConfigurationProperty} not found in configuration.");
            }
            if (!job.ContainsKey(MessageBuilderConfigurationProperty))
            {
                throw new Exception($"{MessageBuilderConfigurationProperty} not found in configuration.");
            }
            if (!job.ContainsKey(ClientConfigurationProperty))
            {
                throw new Exception($"{ClientConfigurationProperty} not found in configuration.");
            }

            BrokerTesterBaseConfiguration configuration = job.ToObject <BrokerTesterBaseConfiguration>();

            configuration.BrokerConfiguration         = GetBrokerConfiguration((JObject)job[BrokerConfigurationProperty]);
            configuration.MessageBuilderConfiguration = GetMessageBuilderConfiguration((JObject)job[MessageBuilderConfigurationProperty]);
            configuration.ClientConfiguration         = GetClientConfiguration((JObject)job[ClientConfigurationProperty]);

            return(configuration);
        }