Exemple #1
0
        private void DoWork(QueueEntry <SimpleWorkItem> w, CountdownEvent latch, WorkInfo info)
        {
            Debug.WriteLine("Starting: {0}", w.Value.Id);
            Assert.Equal("Hello", w.Value.Data);

            try {
                // randomly complete, abandon or blowup.
                if (RandomData.GetBool())
                {
                    Debug.WriteLine("Completing: {0}", w.Value.Id);
                    w.Complete();
                    info.IncrementCompletedCount();
                }
                else if (RandomData.GetBool())
                {
                    Debug.WriteLine("Abandoning: {0}", w.Value.Id);
                    w.Abandon();
                    info.IncrementAbandonCount();
                }
                else
                {
                    Debug.WriteLine("Erroring: {0}", w.Value.Id);
                    info.IncrementErrorCount();
                    throw new ApplicationException();
                }
            } finally {
                latch.Signal();
            }
        }
Exemple #2
0
        public void CanHaveMultipleQueueInstances()
        {
            using (var queue = GetQueue(retries: 0, retryDelay: TimeSpan.Zero)) {
                Debug.WriteLine(String.Format("Queue Id: {0}", queue.QueueId));
                queue.DeleteQueue();

                const int workItemCount = 10;
                const int workerCount   = 3;
                var       latch         = new CountdownEvent(workItemCount);
                var       info          = new WorkInfo();
                var       workers       = new List <IQueue <SimpleWorkItem> > {
                    queue
                };

                for (int i = 0; i < workerCount; i++)
                {
                    var q = GetQueue(retries: 0, retryDelay: TimeSpan.Zero);
                    Debug.WriteLine(String.Format("Queue Id: {0}", q.QueueId));
                    q.StartWorking(w => DoWork(w, latch, info));
                    workers.Add(q);
                }

                Parallel.For(0, workItemCount, i => {
                    var id = queue.Enqueue(new SimpleWorkItem {
                        Data = "Hello",
                        Id   = i
                    });
                    Debug.WriteLine("Enqueued Index: {0} Id: {1}", i, id);
                });

                Assert.True(latch.Wait(TimeSpan.FromSeconds(10)));
                Debug.WriteLine("Completed: {0} Abandoned: {1} Error: {2}", info.CompletedCount, info.AbandonCount, info.ErrorCount);
                for (int i = 0; i < workers.Count; i++)
                {
                    Debug.WriteLine("Worker#{0} Completed: {1} Abandoned: {2} Error: {3}", i, workers[i].CompletedCount, workers[i].AbandonedCount, workers[i].WorkerErrorCount);
                }

                Assert.Equal(workItemCount, info.CompletedCount + info.AbandonCount + info.ErrorCount);

                // In memory queue doesn't share state.
                if (queue.GetType() == typeof(InMemoryQueue <SimpleWorkItem>))
                {
                    Assert.Equal(info.CompletedCount, queue.CompletedCount);
                    Assert.Equal(info.AbandonCount, queue.AbandonedCount - queue.WorkerErrorCount);
                    Assert.Equal(info.ErrorCount, queue.WorkerErrorCount);
                }
                else
                {
                    Assert.Equal(info.CompletedCount, workers.Sum(q => q.CompletedCount));
                    Assert.Equal(info.AbandonCount, workers.Sum(q => q.AbandonedCount) - workers.Sum(q => q.WorkerErrorCount));
                    Assert.Equal(info.ErrorCount, workers.Sum(q => q.WorkerErrorCount));
                }

                workers.ForEach(w => w.Dispose());
            }
        }
        private void DoWork(QueueEntry<SimpleWorkItem> w, CountdownEvent latch, WorkInfo info) {
            Debug.WriteLine("Starting: {0}", w.Value.Id);
            Assert.Equal("Hello", w.Value.Data);

            try {
                // randomly complete, abandon or blowup.
                if (RandomHelper.GetBool()) {
                    Debug.WriteLine("Completing: {0}", w.Value.Id);
                    w.Complete();
                    info.IncrementCompletedCount();
                } else if (RandomHelper.GetBool()) {
                    Debug.WriteLine("Abandoning: {0}", w.Value.Id);
                    w.Abandon();
                    info.IncrementAbandonCount();
                } else {
                    Debug.WriteLine("Erroring: {0}", w.Value.Id);
                    info.IncrementErrorCount();
                    throw new ApplicationException();
                }
            } finally {
                latch.Signal();
            }
        }
        public void CanHaveMultipleQueueInstances() {
            using (var queue = GetQueue(retries: 0, retryDelay: TimeSpan.Zero)) {
                Debug.WriteLine(String.Format("Queue Id: {0}", queue.QueueId));
                queue.DeleteQueue();

                const int workItemCount = 10;
                const int workerCount = 3;
                var latch = new CountdownEvent(workItemCount);
                var info = new WorkInfo();
                var workers = new List<IQueue<SimpleWorkItem>> { queue };

                for (int i = 0; i < workerCount; i++) {
                    var q = GetQueue(retries: 0, retryDelay: TimeSpan.Zero);
                    Debug.WriteLine(String.Format("Queue Id: {0}", q.QueueId));
                    q.StartWorking(w => DoWork(w, latch, info));
                    workers.Add(q);
                }

                Parallel.For(0, workItemCount, i => {
                    var id = queue.Enqueue(new SimpleWorkItem {
                        Data = "Hello",
                        Id = i
                    });
                    Debug.WriteLine("Enqueued Index: {0} Id: {1}", i, id);
                });

                Assert.True(latch.Wait(TimeSpan.FromSeconds(10)));
                Debug.WriteLine("Completed: {0} Abandoned: {1} Error: {2}", info.CompletedCount, info.AbandonCount, info.ErrorCount);
                for (int i = 0; i < workers.Count; i++)
                    Debug.WriteLine("Worker#{0} Completed: {1} Abandoned: {2} Error: {3}", i, workers[i].CompletedCount, workers[i].AbandonedCount, workers[i].WorkerErrorCount);

                Assert.Equal(workItemCount, info.CompletedCount + info.AbandonCount + info.ErrorCount);

                // In memory queue doesn't share state.
                if (queue.GetType() == typeof(InMemoryQueue<SimpleWorkItem>)) {
                    Assert.Equal(info.CompletedCount, queue.CompletedCount);
                    Assert.Equal(info.AbandonCount, queue.AbandonedCount - queue.WorkerErrorCount);
                    Assert.Equal(info.ErrorCount, queue.WorkerErrorCount);
                } else {
                    Assert.Equal(info.CompletedCount, workers.Sum(q => q.CompletedCount));
                    Assert.Equal(info.AbandonCount, workers.Sum(q => q.AbandonedCount) - workers.Sum(q => q.WorkerErrorCount));
                    Assert.Equal(info.ErrorCount, workers.Sum(q => q.WorkerErrorCount));
                }

                workers.ForEach(w => w.Dispose());
            }
        }