/// <summary>
 /// Basic Qos
 /// </summary>
 /// <param name="channel"></param>
 /// <param name="model"></param>
 public void BasicQos(IModel channel, BasicQosModel model)
 {
     if (model == null)
     {
         return;
     }
     channel.BasicQos(prefetchSize: model.PrefetchSize, prefetchCount: model.PrefetchCount, global: model.Global);
 }
        /// <summary>
        /// Basic Consume
        /// </summary>
        /// <param name="queue"></param>
        /// <param name="received"></param>
        /// <param name="consume"></param>
        /// <param name="qos"></param>
        /// <param name="queueDeclare"></param>
        /// <returns></returns>
        public string BasicConsume(string queue, Func <BasicDeliverEventArgsModel, bool> received, BasicConsumeModel consume = null, BasicQosModel qos = null, QueueDeclareModel queueDeclare = null)
        {
            string connectionKey = Guid.NewGuid().ToString();

            var connection = factory.CreateConnection();
            var channel    = connection.CreateModel();

            connections.Add(connectionKey, connection);

            QueueDeclare(channel, queueDeclare);
            BasicQos(channel, qos);

            Console.WriteLine("RabbitMQ: Waiting for messages.");

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, e) =>
            {
                var res = received(new BasicDeliverEventArgsModel
                {
                    Body        = e.Body,
                    ConsumerTag = e.ConsumerTag,
                    DeliveryTag = e.DeliveryTag,
                    Exchange    = e.Exchange,
                    Redelivered = e.Redelivered,
                    RoutingKey  = e.RoutingKey,
                });
                if (!res)
                {
                    return;
                }
                channel.BasicAck(deliveryTag: e.DeliveryTag, multiple: qos?.PrefetchCount > 1);
            };
            if (consume == null)
            {
                consume = new BasicConsumeModel();
            }
            channel.BasicConsume(queue, consume.AutoAck, consume.ConsumerTag, consume.NoLocal, consume.Exclusive, consume.Arguments, consumer);

            return(connectionKey);
        }