protected override Task Send(Message[] messages)
 {
     return Task.Factory.StartNew(msgs =>
         {
             var typedMessages = msgs as Message[];
             typedMessages.GroupBy(m => m.Source).ToList().ForEach(group =>
                 {
                     var source = group.Key;
                     var message = new RabbitMQMessage(group.ToArray());
                     _rabbitmqchannel.BasicPublish(_rabbitmqExchangeName, source, null, message.GetBytes());
                 });
         },
         messages);
 }
 protected override Task Send(Message[] messages)
 {
     return(Task.Factory.StartNew(msgs =>
     {
         var typedMessages = msgs as Message[];
         typedMessages.GroupBy(m => m.Source).ToList().ForEach(group =>
         {
             var source = group.Key;
             var message = new RabbitMQMessage(group.ToArray());
             _rabbitmqchannel.BasicPublish(_rabbitmqExchangeName, source, null, message.GetBytes());
         });
     },
                                  messages));
 }
        private void EnsureConnection()
        {
            var tcs = new TaskCompletionSource <Object>();

            if (1 == Interlocked.Exchange(ref _resource, 1))
            {
                return;
            }

            ThreadPool.QueueUserWorkItem(_ =>
            {
                try
                {
                    var queue = _rabbitmqchannel.QueueDeclare("", false, false, true, null);
                    _rabbitmqchannel.QueueBind(queue.QueueName, _rabbitmqExchangeName, "#");

                    var consumer = new QueueingBasicConsumer(_rabbitmqchannel);
                    _rabbitmqchannel.BasicConsume(queue.QueueName, false, consumer);

                    while (true)
                    {
                        var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                        _rabbitmqchannel.BasicAck(ea.DeliveryTag, false);

                        var message = RabbitMQMessage.Deserialize(ea.Body);

                        OnReceived(ea.RoutingKey, ea.DeliveryTag, message.Messages);
                    }
                }
                catch (Exception ex)
                {
                    tcs.SetException(ex);
                }
            });
        }