//------------------------------------------BROKER RECONNECTION------------------------------------------//

        // Called when a channel is notified of an connection issue.  Once the connection is
        // reestablished, the centrally saved exchanges and queues need to be recreated on the
        // new connection.  This is important when using a broker fail-over behind a load-balancer
        // since the backup broker my not have the exchanges.
        private void RestablishConnection(MessageConsumer messageConsumer, ShutdownEventArgs shutdownEvent)
        {
            if (_connMgr.IsBrokerConnected(messageConsumer.BrokerName))
            {
                return;
            }

            if (_connMgr.IsUnexpectedShutdown(shutdownEvent))
            {
                _logger.LogError(RabbitMqLogEvents.BROKER_CONFIGURATION, "Connection to broker was shutdown.  Reconnection will be attempted.");

                string brokerName = messageConsumer.BrokerName;
                IEnumerable <BrokerMeta> brokerMeta = _exchangeRep.LoadAsync(brokerName).Result;

                _connMgr.ReconnectToBroker(brokerName);

                // Restore the exchanges and queues on what might be a new broker.
                using (IModel channel = _connMgr.CreateChannel(brokerName))
                {
                    ReCreatePublisherExchanges(channel, brokerMeta);
                    ReCreateConsumerQueues(channel, brokerMeta);

                    _exchangeConsumer.BindConsumersToQueues(_messageConsumers, messageConsumer.BrokerName);
                    _rpcExchangeConsumer.BindConsumersToRpcQueues();
                }

                // Watch for future issues.
                AttachBokerMonitoringHandlers();

                _logger.LogDebug(RabbitMqLogEvents.BROKER_CONFIGURATION, "Connection to broker was reestablished.");
            }
        }
        public static EventingBasicConsumer GetBasicConsumer(this IModel channel,
                                                             MessageConsumer eventConsumer)
        {
            Check.NotNull(channel, nameof(channel));
            Check.NotNull(eventConsumer, nameof(eventConsumer));

            var basicConsumer = new EventingBasicConsumer(channel);

            channel.BasicConsume(eventConsumer.QueueName, eventConsumer.QueueSettings, basicConsumer);
            return(basicConsumer);
        }
        public static void QueueDeclare(this IModel channel,
                                        MessageConsumer eventConsumer)
        {
            Check.NotNull(channel, nameof(channel));
            Check.NotNull(eventConsumer, nameof(eventConsumer));

            if (eventConsumer.IsBrokerAssignedName)
            {
                eventConsumer.QueueName = channel.QueueDeclare().QueueName;
                return;
            }

            channel.QueueDeclare(eventConsumer.QueueName,
                                 eventConsumer.QueueSettings.IsDurable,
                                 eventConsumer.QueueSettings.IsExclusive,
                                 eventConsumer.QueueSettings.IsAutoDelete, null);
        }
        public static void QueueBind(this IModel channel, MessageConsumer eventConsumer)
        {
            Check.NotNull(channel, nameof(channel));
            Check.NotNull(eventConsumer, nameof(eventConsumer));

            if (eventConsumer.RouteKeys.Empty())
            {
                channel.QueueBind(eventConsumer.QueueName, eventConsumer.ExchangeName, "");
                return;
            }

            foreach (string routeKey in eventConsumer.RouteKeys)
            {
                if (routeKey.IsNullOrWhiteSpace())
                {
                    throw new InvalidOperationException(
                              $"The queue named: {eventConsumer.QueueName} on the exchange named: {eventConsumer.ExchangeName} " +
                              $"has a null route-key value specified.");
                }

                channel.QueueBind(eventConsumer.QueueName, eventConsumer.ExchangeName, routeKey.ToUpper());
            }
        }