internal static void BasicPublish(string exchange, string routingKey, IBasicProperties basicProperties, object body)
        {
            EnsureAMQPDefaultExists();

            Queue<InSingleProcessMemoryMessage> exchangeBag;
            lock (Exchanges)
                Exchanges.TryGetValue(exchange, out exchangeBag);

            if (exchangeBag == null)
                throw new ArgumentException("Could not find exchange {0}", exchange);

            var message = new InSingleProcessMemoryMessage
            (
                NextPublishSeqNo++,
                routingKey,
                basicProperties,
                body
            );

            lock (exchangeBag)
            {
                exchangeBag.Enqueue(message);
            }
        }
        private static void DispatchMessageToBoundQueues(string exchange, InSingleProcessMemoryMessage message)
        {
            InSingleProcessMemoryBinding[] bindings;
            lock (Bindings)
                bindings = Bindings.ToArray();

            foreach (var binding in bindings)
            {
                if (IsBoundExchange(exchange, binding) && (IsBoundRoutingKey(message, binding)))
                {
                    Queue<InSingleProcessMemoryMessage> queueBag;
                    lock (Queues)
                        Queues.TryGetValue(binding.QueueName, out queueBag);

                    if (queueBag != null)
                    {
                        lock (queueBag)
                            queueBag.Enqueue(message);
                    }
                }
            }

            BasicAcks(typeof(InSingleProcessMemoryBus), new BasicAckEventArgs(message.DeliveryTag));
        }
 private static bool IsBoundRoutingKey(InSingleProcessMemoryMessage message, InSingleProcessMemoryBinding binding)
 {
     return binding.RoutingKey == message.RoutingKey || binding.RoutingKey == "#";
 }