///   <summary>
        ///
        ///   </summary>
        /// <param name="connectionString">Format {user}:{password}@{host}:{port}/{virtualHost}</param>
        /// <param name="connectionPerQueue"></param>
        /// <param name="serializer"></param>
        /// <param name="logger"></param>
        /// <param name="heartbeat"></param>
        public RabbitMQClient(string connectionString, ISerializer serializer = null, ILogger logger = null, ushort heartbeat = 60, bool connectionPerQueue = true)
            : this(connectionPerQueue)
        {
            var match = _connectionStringPattern.Match(connectionString);
            if (!match.Success)
            {
                throw new ArgumentException("Expected format: {user}:{password}@{host}:{port}/{virtualHost}", nameof(connectionString));
            }

            _connectionFactory = new ConnectionFactory
            {
                HostName    = match.Groups["host"].Value,
                Port        = int.Parse(match.Groups["port"].Value),
                UserName    = match.Groups["user"].Value,
                Password    = match.Groups["password"].Value,
                VirtualHost = match.Groups["vhost"].Value,
                AutomaticRecoveryEnabled = true,
                RequestedHeartbeat       = heartbeat,
            };

            _rabbitMQConnectionManager = new RabbitMQConnectionManager(_connectionFactory, logger);
            _rabbitMQConnectionManager.CreateConnection("publisher");
            _modelPublisher = _rabbitMQConnectionManager.ConnectionByName("publisher").CreateModel(false);
            _serializer     = serializer ?? new JsonSerializer();
            _logger         = logger;

            _httpClient = GetHttpClient(match.Groups["user"].Value, match.Groups["password"].Value, match.Groups["host"].Value, int.Parse(match.Groups["port"].Value));
        }
        public RabbitMQClient(ConnectionFactory connectionFactory, ISerializer serializer = null, ILogger logger = null, bool connectionPerQueue = true)
            : this(connectionPerQueue)
        {
            _rabbitMQConnectionManager = new RabbitMQConnectionManager(connectionFactory, logger);
            _rabbitMQConnectionManager.CreateConnection("publisher");
            _modelPublisher = _rabbitMQConnectionManager.ConnectionByName("publisher").CreateModel(false);
            _serializer     = serializer ?? new JsonSerializer();
            _logger         = logger;

            _httpClient = GetHttpClient(connectionFactory.UserName, connectionFactory.Password, connectionFactory.HostName, connectionFactory.Port);
        }
        public RabbitMQClient(string hostName, int port, string userName, string password, string virtualHost,
                              ISerializer serializer = null, ILogger logger = null, ushort heartbeat = 60, bool connectionPerQueue = true)
            : this(connectionPerQueue)
        {
            _connectionFactory = new ConnectionFactory
            {
                HostName    = hostName,
                Port        = port,
                UserName    = userName,
                Password    = password,
                VirtualHost = virtualHost,
                AutomaticRecoveryEnabled = true,
                RequestedHeartbeat       = heartbeat,
            };

            _rabbitMQConnectionManager = new RabbitMQConnectionManager(_connectionFactory, logger);
            _rabbitMQConnectionManager.CreateConnection("publisher");
            _modelPublisher = _rabbitMQConnectionManager.ConnectionByName("publisher").CreateModel(false);
            _serializer     = serializer ?? new JsonSerializer();
            _logger         = logger;

            _httpClient = GetHttpClient(userName, password, hostName, port);
        }