//--- Constructors ---
 public UpdateDelayQueue(TimeSpan delay, IUpdateRecordDispatcher dispatcher, ITransactionalQueue<XDoc> queue) {
     _delay = delay;
     _dispatcher = dispatcher;
     _queueTimer = TaskTimerFactory.Current.New(_delay, CheckExpire, null, TaskEnv.None);
     _persistentQueue = queue;
     _poll = true;
     _pollTimer = TaskTimerFactory.Current.New(TimeSpan.Zero, Poll, null, TaskEnv.None);
     _log.DebugFormat("created queue with {0} items recovered", queue.Count);
 }
示例#2
0
 //--- Constructors ---
 public UpdateDelayQueue(TimeSpan delay, IUpdateRecordDispatcher dispatcher, ITransactionalQueue <XDoc> queue)
 {
     _delay           = delay;
     _dispatcher      = dispatcher;
     _queueTimer      = TaskTimerFactory.Current.New(_delay, CheckExpire, null, TaskEnv.None);
     _persistentQueue = queue;
     _poll            = true;
     _pollTimer       = TaskTimerFactory.Current.New(TimeSpan.Zero, Poll, null, TaskEnv.None);
     _log.DebugFormat("created queue with {0} items recovered", queue.Count);
 }
示例#3
0
 private void Enqueue(ITransactionalQueue <XDoc> queue, int n, ManualResetEvent trigger)
 {
     trigger.WaitOne();
     for (var j = 0; j < n; j++)
     {
         queue.Enqueue(new XDoc("test")
                       .Attr("id", j)
                       .Elem("foo", "bar")
                       .Start("baz")
                       .Attr("meta", "true")
                       .Value("dsfdsssssssssssssssssssssssssssssfdfsfsfsfsfsfsfd")
                       .End()
                       .Elem("id", StringUtil.CreateAlphaNumericKey(16)));
     }
 }
示例#4
0
        public void Perf_test_multi_thread_put_peek_and_take(ITransactionalQueue <XDoc> queue)
        {
            long totalEnqueue = 0;
            long totalDequeue = 0;
            var  w            = 5;
            var  n            = 5000;
            var  m            = 4;

            for (var k = 0; k < m; k++)
            {
                var enqueues = new List <Result>();
                var trigger  = new ManualResetEvent(false);
                for (var i = 0; i < w; i++)
                {
                    enqueues.Add(AsyncUtil.ForkThread(() => Enqueue(queue, n, trigger), new Result()));
                }
                var stopwatch = Stopwatch.StartNew();
                trigger.Set();
                foreach (var r in enqueues)
                {
                    r.Wait();
                }
                stopwatch.Stop();
                Assert.AreEqual(n * w, queue.Count);
                totalEnqueue += stopwatch.ElapsedMilliseconds;
                var j        = 0;
                var dequeues = new List <Result <int> >();
                trigger.Reset();
                for (var i = 0; i < w; i++)
                {
                    dequeues.Add(AsyncUtil.ForkThread(() => Dequeue(queue, trigger), new Result <int>()));
                }
                stopwatch = Stopwatch.StartNew();
                trigger.Set();
                foreach (var r in dequeues)
                {
                    j += r.Wait();
                }
                stopwatch.Stop();
                totalDequeue += stopwatch.ElapsedMilliseconds;
                Assert.AreEqual(0, queue.Count);
                Assert.AreEqual(n * w, j);
            }
            Console.WriteLine("Enqueue: {0:0,000}/s", n * m * 1000 / totalEnqueue);
            Console.WriteLine("Dequeue: {0:0,000}/s", n * m * 1000 / totalDequeue);
        }
示例#5
0
        private void Perf_test_single_thread_put_peek_and_take(ITransactionalQueue <XDoc> queue)
        {
            long totalEnqueue = 0;
            long totalDequeue = 0;
            var  n            = 20000;
            var  m            = 4;

            for (var k = 0; k < m; k++)
            {
                var items = new List <XDoc>();
                for (var i = 0; i < n; i++)
                {
                    items.Add(new XDoc("test")
                              .Attr("id", i)
                              .Elem("foo", "bar")
                              .Start("baz")
                              .Attr("meta", "true")
                              .Value("dsfdsssssssssssssssssssssssssssssfdfsfsfsfsfsfsfd")
                              .End()
                              .Start("id", StringUtil.CreateAlphaNumericKey(16)));
                }
                var stopwatch = Stopwatch.StartNew();
                foreach (var itm in items)
                {
                    queue.Enqueue(itm);
                }
                Assert.AreEqual(n, queue.Count);
                stopwatch.Stop();
                totalEnqueue += stopwatch.ElapsedMilliseconds;
                var j = 0;
                stopwatch = Stopwatch.StartNew();
                var v = queue.Dequeue();
                while (v != null)
                {
                    Assert.IsTrue(queue.CommitDequeue(v.Id));
                    j++;
                    v = queue.Dequeue();
                }
                stopwatch.Stop();
                totalDequeue += stopwatch.ElapsedMilliseconds;
                Assert.AreEqual(n, j);
                Assert.AreEqual(0, queue.Count);
            }
            Console.WriteLine("Enqueue: {0:0,000}/s", n * m * 1000 / totalEnqueue);
            Console.WriteLine("Dequeue: {0:0,000}/s", n * m * 1000 / totalDequeue);
        }
示例#6
0
        private int Dequeue(ITransactionalQueue <XDoc> queue, ManualResetEvent trigger)
        {
            trigger.WaitOne();
            var j = 0;
            ITransactionalQueueEntry <XDoc> value = queue.Dequeue();

            while (value != null)
            {
                bool success = queue.CommitDequeue(value.Id);
                if (!success)
                {
                    throw new InvalidOperationException();
                }
                j++;
                value = queue.Dequeue();
            }
            return(j);
        }
 //--- Construtors
 public PersistentPubSubDispatchQueue(string queuePath, TaskTimerFactory taskTimerFactory, TimeSpan retryTime, Func<DispatchItem, Result<bool>> handler)
 {
     if(string.IsNullOrEmpty(queuePath)) {
         throw new ArgumentNullException("location");
     }
     if(taskTimerFactory == null) {
         throw new ArgumentNullException("taskTimerFactory");
     }
     if(handler == null) {
         throw new ArgumentNullException("handler");
     }
     _queuePath = queuePath;
     _retryTime = retryTime;
     _queueTimer = taskTimerFactory.New(RetryDequeue, null);
     _queue = new TransactionalQueue<DispatchItem>(new MultiFileQueueStream(queuePath), new DispatchItemSerializer()) {
         DefaultCommitTimeout = TimeSpan.MaxValue
     };
     _dequeueHandler = handler;
     Kick();
 }
示例#8
0
        private void Perf_test_single_thread_put_peek_and_take(ITransactionalQueue<XDoc> queue)
        {
            long totalEnqueue = 0;
            long totalDequeue = 0;
            var n = 20000;
            var m = 4;

            for(var k = 0; k < m; k++) {
                var items = new List<XDoc>();
                for(var i = 0; i < n; i++) {
                    items.Add(new XDoc("test")
                                  .Attr("id", i)
                                  .Elem("foo", "bar")
                                  .Start("baz")
                                  .Attr("meta", "true")
                                  .Value("dsfdsssssssssssssssssssssssssssssfdfsfsfsfsfsfsfd")
                                  .End()
                                  .Start("id", StringUtil.CreateAlphaNumericKey(16)));
                }
                var stopwatch = Stopwatch.StartNew();
                foreach(var itm in items) {
                    queue.Enqueue(itm);
                }
                Assert.AreEqual(n, queue.Count);
                stopwatch.Stop();
                totalEnqueue += stopwatch.ElapsedMilliseconds;
                var j = 0;
                stopwatch = Stopwatch.StartNew();
                var v = queue.Dequeue();
                while(v != null) {
                    Assert.IsTrue(queue.CommitDequeue(v.Id));
                    j++;
                    v = queue.Dequeue();
                }
                stopwatch.Stop();
                totalDequeue += stopwatch.ElapsedMilliseconds;
                Assert.AreEqual(n, j);
                Assert.AreEqual(0, queue.Count);
            }
            Console.WriteLine("Enqueue: {0:0,000}/s", n * m * 1000 / totalEnqueue);
            Console.WriteLine("Dequeue: {0:0,000}/s", n * m * 1000 / totalDequeue);
        }
示例#9
0
 private void Enqueue(ITransactionalQueue<XDoc> queue, int n, ManualResetEvent trigger)
 {
     trigger.WaitOne();
     for(var j = 0; j < n; j++) {
         queue.Enqueue(new XDoc("test")
             .Attr("id", j)
             .Elem("foo", "bar")
             .Start("baz")
                 .Attr("meta", "true")
                 .Value("dsfdsssssssssssssssssssssssssssssfdfsfsfsfsfsfsfd")
             .End()
             .Elem("id", StringUtil.CreateAlphaNumericKey(16)));
     }
 }
示例#10
0
 private int Dequeue(ITransactionalQueue<XDoc> queue, ManualResetEvent trigger)
 {
     trigger.WaitOne();
     var j = 0;
     ITransactionalQueueEntry<XDoc> value = queue.Dequeue();
     while(value != null) {
         bool success = queue.CommitDequeue(value.Id);
         if(!success) {
             throw new InvalidOperationException();
         }
         j++;
         value = queue.Dequeue();
     }
     return j;
 }
示例#11
0
        public void Perf_test_multi_thread_put_peek_and_take(ITransactionalQueue<XDoc> queue)
        {
            long totalEnqueue = 0;
            long totalDequeue = 0;
            var w = 5;
            var n = 5000;
            var m = 4;

            for(var k = 0; k < m; k++) {
                var enqueues = new List<Result>();
                var trigger = new ManualResetEvent(false);
                for(var i = 0; i < w; i++) {
                    enqueues.Add(Async.ForkThread(() => Enqueue(queue, n, trigger), new Result()));
                }
                var stopwatch = Stopwatch.StartNew();
                trigger.Set();
                foreach(var r in enqueues) {
                    r.Wait();
                }
                stopwatch.Stop();
                Assert.AreEqual(n * w, queue.Count);
                totalEnqueue += stopwatch.ElapsedMilliseconds;
                var j = 0;
                var dequeues = new List<Result<int>>();
                trigger.Reset();
                for(var i = 0; i < w; i++) {
                    dequeues.Add(Async.ForkThread(() => Dequeue(queue, trigger), new Result<int>()));
                }
                stopwatch = Stopwatch.StartNew();
                trigger.Set();
                foreach(var r in dequeues) {
                    j += r.Wait();
                }
                stopwatch.Stop();
                totalDequeue += stopwatch.ElapsedMilliseconds;
                Assert.AreEqual(0, queue.Count);
                Assert.AreEqual(n * w, j);
            }
            Console.WriteLine("Enqueue: {0:0,000}/s", n * m * 1000 / totalEnqueue);
            Console.WriteLine("Dequeue: {0:0,000}/s", n * m * 1000 / totalDequeue);
        }