private void Enqueue(string queueName, string data)
 {
     using (var queue = PersistentQueue.WaitFor(Path.Combine(queryRoot, queueName), TimeSpan.FromSeconds(30)))
         using (var session = queue.OpenSession())
         {
             session.Enqueue(Encoding.UTF8.GetBytes(data));
             session.Flush();
         }
 }
示例#2
0
 void AddToQueue(byte[] data)
 {
     Thread.Sleep(150);
     using (var queue = PersistentQueue.WaitFor(SharedStorage, TimeSpan.FromSeconds(30)))
         using (var session = queue.OpenSession())
         {
             session.Enqueue(data);
             session.Flush();
         }
 }
示例#3
0
 byte[] ReadQueue()
 {
     Thread.Sleep(150);
     using (var queue = PersistentQueue.WaitFor(SharedStorage, TimeSpan.FromSeconds(30)))
         using (var session = queue.OpenSession())
         {
             var data = session.Dequeue();
             session.Flush();
             return(data);
         }
 }
示例#4
0
        public void can_sequence_queues_on_separate_threads()
        {
            // ReSharper disable InconsistentNaming
            int t1s, t2s;

            // ReSharper restore InconsistentNaming
            t1s = t2s = 0;
            const int target = 100;

            var t1 = new Thread(() =>
            {
                for (int i = 0; i < target; i++)
                {
                    using (var subject = PersistentQueue.WaitFor("queue_b", TimeSpan.FromSeconds(10)))
                    {
                        using (var session = subject.OpenSession())
                        {
                            Console.Write("(");
                            session.Enqueue(new byte[] { 1, 2, 3, 4 });
                            Interlocked.Increment(ref t1s);
                            session.Flush();
                            Console.Write(")");
                        }
                        Thread.Sleep(0);
                    }
                }
            });
            var t2 = new Thread(() => {
                for (int i = 0; i < target; i++)
                {
                    using (var subject = PersistentQueue.WaitFor("queue_b", TimeSpan.FromSeconds(10)))
                    {
                        using (var session = subject.OpenSession())
                        {
                            Console.Write("<");
                            session.Dequeue();
                            Interlocked.Increment(ref t2s);
                            session.Flush();
                            Console.Write(">");
                        }
                        Thread.Sleep(0);
                    }
                }
            });

            t1.Start();
            t2.Start();

            t1.Join();
            t2.Join();
            Assert.That(t1s, Is.EqualTo(target));
            Assert.That(t2s, Is.EqualTo(target));
        }
示例#5
0
        /// <summary>
        /// 将一个对象放入指定的队列
        /// 有可能在不同进程中入列和出列
        /// </summary>
        /// <param name="queueName">队列名称</param>
        /// <param name="data">(序列化的)对象</param>
        public static void Enqueue(string queueRootFolder, string queueName, string data)
        {
            if (_queueRootFolder != null && _queueRootFolder != queueRootFolder)
            {
                throw new Exception("队列根目录必须与CreateDequeuers指定的一致");
            }

            using (var queue = PersistentQueue.WaitFor(Path.Combine(queueRootFolder, queueName), TimeSpan.FromSeconds(60)))
                using (var session = queue.OpenSession())
                {
                    session.Enqueue(Encoding.UTF8.GetBytes(data));
                    session.Flush();
                }
        }
        /// <summary>
        /// 尝试获取Bus提供的文件夹下所以队列,并检查是否有数据
        /// </summary>
        /// <returns></returns>
        protected override IntervalTask.WorkingState DoWork()
        {
            Directory.GetDirectories(_queueRootFolder, "*", SearchOption.TopDirectoryOnly)
            .AsParallel().ForAll(queuePath =>
            {
                if (File.Exists(Path.Combine(queuePath, "meta.state")))       //检验是否是queue的文件夹
                {
                    var queueName = Path.GetFileName(queuePath);
                    using (var queue = PersistentQueue.WaitFor(Path.Combine(_queueRootFolder, queueName), TimeSpan.FromSeconds(60)))
                        if (queue?.EstimatedCountOfItemsInQueue > 0)
                        {
                            QueueWorkerBus.StartWorkersForQueue(queueName);
                        }
                }
            });

            return(IntervalTask.WorkingState.BUSY);
        }
示例#7
0
        /// <summary>
        /// 每次从队列取出一个并处理
        /// </summary>
        /// <returns></returns>
        protected override WorkingState DoWork()
        {
            var    isWorking  = false;
            string dataString = null;

            using (var queue = PersistentQueue.WaitFor(Path.Combine(_queueRootFolder, _queueName), TimeSpan.FromSeconds(60)))
                using (var session = queue.OpenSession())
                {
                    var data = session.Dequeue();
                    if (data != null)
                    {
                        dataString = Encoding.UTF8.GetString(data);
                        Helper.Log($"Get Dequeue Data : {dataString}");
                    }

                    session.Flush();
                }
            if (dataString != null)
            {
                isWorking = true;
                try
                {
                    Helper.Log($"Start Processing Dequeue Data : {dataString}");
                    _dequeueAction(dataString);
                }
                catch (Exception ex)
                {
                    var msg = $"Error Processing Dequeue Data : {dataString}";
                    Helper.Error(ex, msg);
                }
                finally
                {
                    //防止在处理过程中断电
                    Helper.Log($"End Processing Dequeue Data : {dataString}");
                }
            }
            return(isWorking ? WorkingState.BUSY : WorkingState.IDLE);
        }
示例#8
0
 public void Setup()
 {
     _q = PersistentQueue.WaitFor("./queue", TimeSpan.FromSeconds(10));
 }