/// <summary>
        /// 发送消息队列
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="queueKey"></param>
        /// <param name="message"></param>
        public void SendToMQ <T>(string queueKey, T message)
        {
            ExchangeQueue queue = _Queues.Find(x => x.QueueKey.Equals(queueKey, StringComparison.OrdinalIgnoreCase));

            IModel channel = ChannelSendDictionary.GetOrAdd(queueKey, (queueKey) =>
            {
                return(CreateSendChannel(queue));
            });

            if (queue == null)
            {
                throw new KeyNotFoundException("当前队列配置信息不存在...");
            }
            if (channel == null)
            {
                throw new KeyNotFoundException("当前队列ID不存在...");
            }

            var properties = channel.CreateBasicProperties();

            properties.Persistent = true;

            string jsonStr = JsonConvert.SerializeObject(message);

            byte[] bodys = Encoding.UTF8.GetBytes(jsonStr);

            //客户端投递消息到Exchange
            channel.BasicPublish(queue.ExchangeName, queue.RoutingKey, properties, bodys);
        }
        /// <summary>
        /// 创建一个发送消息的MQ信道
        /// </summary>
        /// <param name="queue"></param>
        /// <returns></returns>
        public IModel CreateSendChannel(ExchangeQueue queue)
        {
            //客户端连接到消息队列服务器【TCP】
            var conn = _RabbitMqFactory.CreateConnection();
            //打开一个channel信道
            var channel = conn.CreateModel();

            //客户端声明一个Exchange,并设置相关属性
            channel.ExchangeDeclare(exchange: queue.ExchangeName, type: queue.ExchangeType, durable: queue.Durable, autoDelete: queue.AutoDelete, arguments: null);
            //客户端声明一个Queue,并设置相关属性
            channel.QueueDeclare(queue: queue.QueueName, durable: queue.Durable, autoDelete: queue.AutoDelete, exclusive: false, arguments: null);
            //客户端使用Routing Key ,在Exchange和Queue之间建立好绑定关系
            channel.QueueBind(queue: queue.QueueName, exchange: queue.ExchangeName, routingKey: queue.RoutingKey);

            return(channel);
        }
        /// <summary>
        /// 消费队列
        /// </summary>
        /// <param name="queueKey"></param>
        /// <param name="action"></param>
        public IConnection ConsumeReturnConnection(string queueKey, Action <string> action)
        {
            ExchangeQueue queue = _Queues.Find(x => x.QueueKey.Equals(queueKey, StringComparison.OrdinalIgnoreCase));

            if (queue == null)
            {
                throw new KeyNotFoundException("当前队列配置信息不存在...");
            }

            #region 新打开一个消费的队列信道

            //客户端连接到消息队列服务器【TCP】
            var conn = _RabbitMqFactory.CreateConnection();
            //打开一个channel信道
            var channel = conn.CreateModel();
            //客户端声明一个Exchange,并设置相关属性[消费者不需要指定Exchange]
            //channel.ExchangeDeclare(exchange: queue.ExchangeName, type: queue.ExchangeType, durable: queue.Durable, autoDelete: queue.AutoDelete, arguments: null);
            //客户端声明一个Queue,并设置相关属性
            channel.QueueDeclare(queue: queue.QueueName, durable: queue.Durable, autoDelete: queue.AutoDelete, exclusive: false, arguments: null);
            //客户端使用Routing Key ,在Exchange和Queue之间建立好绑定关系 [消费者不需要绑定]
            // channel.QueueBind(queue: queue.QueueName, exchange: queue.ExchangeName, routingKey: queue.RoutingKey);

            #endregion
            #region 消费消息数据
            // 设置prefetchCount : 1来告知RabbitMQ,在未收到消费端的消息确认时,不再分发消息,也就确保了当消费端处于忙碌状态时,不继续发送数据
            channel.BasicQos(prefetchSize: 0, prefetchCount: queue.PrefetchCount, global: false);
            //设置消息持久化【队列持久化,Exchange持久化,在设置消息持久化,三个同时设置,才能做到消息的真正持久化】
            //定义这个队列的消费者
            EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
            //false为手动应答,true为自动应答
            channel.BasicConsume(queue.QueueName, false, consumer);

            #endregion

            //客户端投递消息到Exchange
            consumer.Received += (model, ea) => {
                var msgBody = Encoding.UTF8.GetString(ea.Body);

                //调用后续处理的委托
                action.Invoke(msgBody);
                //确认该消息已被消费
                channel.BasicAck(ea.DeliveryTag, false);
            };

            return(conn);
        }