IQueueSpecifier GetQueueInfo(string queueName)
        {
            var qPath = _parent.GetQueuePath(_exchangeName, queueName);

            var qMtx = FDMessageBus.GetQueueMutex(_exchangeName, queueName);

            using (qMtx)
            {
                if (qMtx.Wait(TimeSpan.FromSeconds(120)))
                {
                    var di = new DirectoryInfo(qPath);
                    if (!di.Exists)
                    {
                        return(null);
                    }

                    var fi = new FileInfo(Path.Combine(qPath, "routes.json"));
                    if (fi.Exists)
                    {
                        using (var sr = fi.OpenText())
                        {
                            var text = sr.ReadToEnd();
                            var mqd  = JsonConvert.DeserializeObject <MessageQueueDeclaration>(text);
                            return(new FDQueueSpecifier(mqd));
                        }
                    }
                }
            }


            return(null);
        }
        private FDMessageEnvelope MaybeReserveOne()
        {
            var qPath = FDMessageBus.GetQueuePath(_busName, _exchangeName, _queueName);

            foreach (var it in _messageNames)
            {
                if (_taken.Contains(it))
                {
                    continue;
                }


                var mmtx = FDMessageBus.GetMessageMutex(_exchangeName, _queueName, it);


                if (mmtx.Open())
                {
                    try
                    {
                        var fn = Path.Combine(qPath, it);
                        var fi = new FileInfo(fn);
                        _taken.Add(it);
                        if (fi.Exists)
                        {
                            using (var sr = fi.OpenText())
                            {
                                var text   = sr.ReadToEnd();
                                var retval = JsonConvert.DeserializeObject <FDMessageEnvelope>(text,
                                                                                               _serializerSettings);
                                if (null != retval)
                                {
                                    retval.Lock = mmtx;

                                    return(retval);
                                }
                            }
                        }


                        mmtx.Release();
                    }
                    catch     // not finally, because if we can open the message, control of the mutex passes
                              // to the caller
                    {
                        mmtx.Release();
                    }
                }


                mmtx.Dispose();
            }


            return(null);
        }
        public FDMessagePublisher()
        {
            var cfg = Catalog.Factory.Resolve <IConfig>(SpecialFactoryContexts.Routed);

            _busName      = cfg[MessagePublisherLocalConfig.HostConnectionString];
            _exchangeName = cfg[MessagePublisherLocalConfig.ExchangeName];


            _bus = Catalog.Preconfigure().Add(MessageBusSpecifierLocalConfig.HostConnectionString, _busName)
                   .ConfiguredCreate(() => new FDMessageBus());
        }
        void DeleteMessage()
        {
            var qPath = FDMessageBus.GetQueuePath(_bus, _exchange, _queueName);
            var fn    = Path.Combine(qPath, string.Format("{0}.msg", _message.Id));
            var fi    = new FileInfo(fn);

            if (fi.Exists)
            {
                fi.Delete();
            }
        }
        public IQueueSpecifier SpecifyQueue(string queueName)
        {
            var exPath = _parent.GetExchangePath(_exchangeName);
            var exMtx  = FDMessageBus.GetExchangeMutex(_exchangeName);

            using (exMtx)
            {
                if (exMtx.Wait(TimeSpan.FromSeconds(30)))
                {
                    return(GetQueueInfo(queueName));
                }
            }

            return(null);
        }
        private void GetMessageNames()
        {
            _messageNames.Clear();


            var qPath = FDMessageBus.GetQueuePath(_busName, _exchangeName, _queueName);

            var di = new DirectoryInfo(qPath);

            if (!di.Exists)
            {
                return;
            }

            _messageNames.AddRange(di.EnumerateFiles("*.msg").Select(it => it.Name));
        }
        public void Send()
        {
            lock (_sendLock)
            {
                while (_pending.Any())
                {
                    var qPath = FDMessageBus.GetQueuePath(_busName, _exchangeName, _queueName);
                    var di    = new DirectoryInfo(qPath);
                    if (!di.Exists)
                    {
                        throw new FileNotFoundException();
                    }

                    //var qMtx = FDMessageBus.GetQueueMutex(_exchangeName, _queueName);

                    //using (qMtx)
                    {
                        //if (qMtx.Wait(TimeSpan.FromSeconds(120)))
                        {
                            object item;
                            while (_pending.TryDequeue(out item))
                            {
                                var id      = Guid.NewGuid().ToString();
                                var msgPath = Path.Combine(qPath, string.Format("{0}.msg", id));
                                using (var sw = File.CreateText(msgPath))
                                {
                                    var text = JsonConvert.SerializeObject(new FDMessageEnvelope {
                                        Id = id, Data = item, MessageType = item.GetType()
                                    }, _jsonSerializerSettings);
                                    sw.Write(text);
                                    sw.Flush();
                                    sw.Close();
                                }
                            }
                        }
                    }
                }
            }
        }
        public IExchangeSpecifier DeleteQueue(string queueName)
        {
            var qPath  = _parent.GetQueuePath(_exchangeName, queueName);
            var qMtx   = FDMessageBus.GetQueueMutex(_exchangeName, queueName);
            var exPath = _parent.GetExchangePath(_exchangeName);
            var exMtx  = FDMessageBus.GetExchangeMutex(_exchangeName);

            using (exMtx)
                using (qMtx)
                {
                    if (exMtx.Wait(TimeSpan.FromSeconds(30)) && qMtx.Wait(TimeSpan.FromSeconds(30)))
                    {
                        var di = new DirectoryInfo(qPath);
                        if (!di.Exists)
                        {
                            return(this);
                        }

                        di.Delete(true);
                    }
                }
            return(this);
        }
        public IExchangeSpecifier DeclareQueue(string queueName, params string[] boundRoutes)
        {
            var qPath  = _parent.GetQueuePath(_exchangeName, queueName);
            var qMtx   = FDMessageBus.GetQueueMutex(_exchangeName, queueName);
            var exPath = _parent.GetExchangePath(_exchangeName);
            var exMtx  = FDMessageBus.GetExchangeMutex(_exchangeName);

            using (exMtx)
                using (qMtx)
                {
                    if (exMtx.Wait(TimeSpan.FromSeconds(30)) && qMtx.Wait(TimeSpan.FromSeconds(30)))
                    {
                        var di = new DirectoryInfo(qPath);
                        if (di.Exists)
                        {
                            return(this);
                        }
                        di.Create();

                        var fi = new FileInfo(Path.Combine(qPath, "routes.json"));
                        using (var sw = fi.CreateText())
                        {
                            var q = new MessageQueueDeclaration {
                                Name = queueName
                            };
                            q.Bindings.AddRange(boundRoutes);
                            var text = JsonConvert.SerializeObject(q);
                            sw.Write(text);
                            sw.Flush();
                            sw.Close();
                        }
                    }
                }


            return(this);
        }
 internal FDExchange(FDMessageBus parent, string exchangeName, ExchangeTypes exchangeType)
 {
     _parent       = parent;
     _exchangeName = exchangeName;
     _exchangeType = exchangeType;
 }