コード例 #1
0
        public void CloseBehviour()
        {
            var queue = new SharedQueue();

            queue.Enqueue("Hello World");
            //queue.Close();

            var item = queue.Dequeue().ToString();

            Console.Out.WriteLine("item = {0}", item);

            ThreadPool.QueueUserWorkItem(state =>
            {
                // expect the queue to block here
                Console.WriteLine("Dequeue in thread");
                try
                {
                    var item2 = queue.Dequeue().ToString();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception in thread\n{0}", e.ToString());
                }
            });

            Thread.Sleep(100);
            Console.WriteLine("Closing queue");
            queue.Close();

            Console.WriteLine("Done");
        }
コード例 #2
0
            public void WillReceiveOnly(params uint[] values)
            {
                foreach (var value in values)
                {
                    object received;
                    Assert.IsTrue(output.Dequeue(500, out received), "Couldn't wait for {0}", value);
                    Assert.AreEqual(value, Value(received));
                }

                WillNotReceiveAnything();
            }
コード例 #3
0
        public void TestRecoverAfterCancel_()
        {
            UTF8Encoding enc = new UTF8Encoding();

            Channel.BasicPublish("", Queue, null, enc.GetBytes("message"));
            EventingBasicConsumer Consumer = new EventingBasicConsumer(Channel);
            SharedQueue <BasicDeliverEventArgs> EventQueue = new SharedQueue <BasicDeliverEventArgs>();

            Consumer.Received += (_, e) => EventQueue.Enqueue(e);

            string CTag = Channel.BasicConsume(Queue, false, Consumer);
            BasicDeliverEventArgs Event = EventQueue.Dequeue();

            Channel.BasicCancel(CTag);
            Channel.BasicRecover(true);

            EventingBasicConsumer Consumer2 = new EventingBasicConsumer(Channel);
            SharedQueue <BasicDeliverEventArgs> EventQueue2 = new SharedQueue <BasicDeliverEventArgs>();

            Consumer2.Received += (_, e) => EventQueue2.Enqueue(e);
            Channel.BasicConsume(Queue, false, Consumer2);
            BasicDeliverEventArgs Event2 = EventQueue2.Dequeue();

            CollectionAssert.AreEqual(Event.Body.ToArray(), Event2.Body.ToArray());
            Assert.IsFalse(Event.Redelivered);
            Assert.IsTrue(Event2.Redelivered);
        }
コード例 #4
0
        public void TestDequeueNoWait2()
        {
            var q = new SharedQueue();

            q.Enqueue(1);
            Assert.AreEqual(1, q.Dequeue());
            Assert.AreEqual(0, q.DequeueNoWait(0));
        }
コード例 #5
0
        public void TestCloseWhenFull()
        {
            var q = new SharedQueue();

            q.Enqueue(1);
            q.Enqueue(2);
            q.Enqueue(3);
            q.Close();
            var de = new DelayedEnqueuer(q, 0, 4);

            ExpectEof(de.EnqueueValue);
            Assert.AreEqual(1, q.Dequeue());
            Assert.AreEqual(2, q.DequeueNoWait(0));
            bool r = q.Dequeue(TimeSpan.FromMilliseconds(1), out object v);

            Assert.IsTrue(r);
            Assert.AreEqual(3, v);
            ExpectEof(de.Dequeue);
        }
コード例 #6
0
        public void TestCloseWhenFull()
        {
            SharedQueue q = new SharedQueue();
            object      v;

            q.Enqueue(1);
            q.Enqueue(2);
            q.Enqueue(3);
            q.Close();
            DelayedEnqueuer de = new DelayedEnqueuer(q, 0, 4);

            ExpectEof(new Thunk(de.EnqueueValue));
            Assert.AreEqual(1, q.Dequeue());
            Assert.AreEqual(2, q.DequeueNoWait(0));
            bool r = q.Dequeue(1, out v);

            Assert.IsTrue(r);
            Assert.AreEqual(3, v);
            ExpectEof(new Thunk(de.Dequeue));
        }
コード例 #7
0
        public void TestTimeoutLong()
        {
            var q = new SharedQueue();

            ResetTimer();
            bool r = q.Dequeue(TimingInterval, out object v);

            Assert.Less(TimingInterval - SafetyMargin, ElapsedMs());
            Assert.IsTrue(!r);
            Assert.AreEqual(null, v);
        }
コード例 #8
0
        public void TestTimeoutNegative()
        {
            var q = new SharedQueue();

            ResetTimer();
            bool r = q.Dequeue(TimeSpan.FromMilliseconds(-10000), out object v);

            Assert.Greater(SafetyMargin, ElapsedMs());
            Assert.IsTrue(!r);
            Assert.AreEqual(null, v);
        }
コード例 #9
0
        public void TestDelayedEnqueue()
        {
            var q = new SharedQueue();

            ResetTimer();
            EnqueueAfter(TimingInterval, q, 1);
            Assert.AreEqual(0, q.DequeueNoWait(0));
            Assert.Greater(TimingInterval - SafetyMargin, ElapsedMs());
            Assert.AreEqual(1, q.Dequeue());
            Assert.Less(TimingInterval - SafetyMargin, ElapsedMs());
        }
コード例 #10
0
        public void TestTimeoutNegative()
        {
            var q = new SharedQueue();

            ResetTimer();
            object v;
            bool   r = q.Dequeue(-10000, out v);

            Assert.Greater(SafetyMargin, ElapsedMs());
            Assert.IsTrue(!r);
            Assert.AreEqual(null, v);
        }
コード例 #11
0
        public void TestDoublePoll()
        {
            var q = new SharedQueue();

            EnqueueAfter(TimingInterval * 2, q, 123);

            ResetTimer();
            bool r;

            r = q.Dequeue(TimingInterval, out object v);
            Assert.Less(TimingInterval - SafetyMargin, ElapsedMs());
            Assert.Greater(TimingInterval + SafetyMargin, ElapsedMs());
            Assert.IsTrue(!r);
            Assert.AreEqual(null, v);

            r = q.Dequeue(TimingInterval * 2, out v);
            Assert.Less(TimingInterval * 2 - SafetyMargin, ElapsedMs());
            Assert.Greater(TimingInterval * 2 + SafetyMargin, ElapsedMs());
            Assert.IsTrue(r);
            Assert.AreEqual(123, v);
        }
コード例 #12
0
        public void TestBgLong()
        {
            var q = new SharedQueue();

            EnqueueAfter(TimingInterval * 2, q, 123);

            ResetTimer();
            bool r = q.Dequeue(TimingInterval, out object v);

            Assert.Greater(TimingInterval + SafetyMargin, ElapsedMs());
            Assert.IsTrue(!r);
            Assert.AreEqual(null, v);
        }
コード例 #13
0
ファイル: SharedQueue.cs プロジェクト: nmdiaz/Rebus.RabbitMq
 bool IEnumerator.MoveNext()
 {
     try
     {
         m_current = m_queue.Dequeue();
         return(true);
     }
     catch (EndOfStreamException)
     {
         m_current = default(T);
         return(false);
     }
 }
コード例 #14
0
        public void TestTimeoutShort()
        {
            var q = new SharedQueue();

            q.Enqueue(123);

            ResetTimer();
            bool r = q.Dequeue(TimingInterval, out object v);

            Assert.Greater(SafetyMargin, ElapsedMs());
            Assert.IsTrue(r);
            Assert.AreEqual(123, v);
        }
コード例 #15
0
        public void TestDoubleBg()
        {
            var q = new SharedQueue();

            EnqueueAfter(TimingInterval, q, 123);
            EnqueueAfter(TimingInterval_2X, q, 234);

            ResetTimer();
            bool r;

            r = q.Dequeue(TimingInterval_2X, out object v);
            Assert.Less(TimingInterval - SafetyMargin, ElapsedMs());
            Assert.Greater(TimingInterval + SafetyMargin, ElapsedMs());
            Assert.IsTrue(r);
            Assert.AreEqual(123, v);

            r = q.Dequeue(TimingInterval_2X, out v);
            Assert.Less(TimingInterval_2X - SafetyMargin, ElapsedMs());
            Assert.Greater(TimingInterval_2X + SafetyMargin, ElapsedMs());
            Assert.IsTrue(r);
            Assert.AreEqual(234, v);
        }
コード例 #16
0
        public void TestTimeoutInfinite()
        {
            var q = new SharedQueue();

            EnqueueAfter(TimingInterval, q, 123);

            ResetTimer();
            bool r = q.Dequeue(Timeout.InfiniteTimeSpan, out object v);

            Assert.Less(TimingInterval - SafetyMargin, ElapsedMs());
            Assert.IsTrue(r);
            Assert.AreEqual(123, v);
        }
コード例 #17
0
        public void TestBgShort()
        {
            var q = new SharedQueue();

            EnqueueAfter(TimingInterval, q, 123);

            ResetTimer();
            object v;
            bool   r = q.Dequeue(TimingInterval * 2, out v);

            Assert.Less(TimingInterval - SafetyMargin, ElapsedMs());
            Assert.IsTrue(r);
            Assert.AreEqual(123, v);
        }
コード例 #18
0
        /// <summary>
        /// Получить очередное сообщение.
        /// </summary>
        public Message Dequeue()
        {
            var queueEntry = _queue.Dequeue();

            return(new Message
            {
                DeliveryTag = queueEntry.DeliveryTag,
                ConsumerId = queueEntry.ConsumerTag,
                Exchange = queueEntry.Exchange,
                RoutingKey = queueEntry.RoutingKey,
                Properties = _messageConverter.ConvertFrom(queueEntry.BasicProperties),
                Body = queueEntry.Body
            });
        }
コード例 #19
0
 public void Process()
 {
     while (true)
     {
         if (!m_queue.IsEmpty())
         {
             var vitals = m_queue.Dequeue();
             m_vitalsManager.AlertUsers(vitals);
             PatientAlert alert = m_validator.ValidateVitalsRange(vitals);
             m_alertManager.AlertUsers(alert);
             m_vitalsRepository.WriteVitals(vitals);
         }
     }
 }
コード例 #20
0
        public QueueingConsumerFactory(IEasyNetQLogger logger, IConsumerErrorStrategy consumerErrorStrategy)
        {
            this.logger = logger;
            this.consumerErrorStrategy = consumerErrorStrategy;

            // start the subscription callback thread
            // all subscription actions registered with Subscribe or Request
            // run here.
            subscriptionCallbackThread = new Thread(_ =>
            {
                while (true)
                {
                    if (disposed)
                    {
                        break;
                    }

                    try
                    {
                        BasicDeliverEventArgs deliverEventArgs;
                        lock (sharedQueueLock)
                        {
                            deliverEventArgs = (BasicDeliverEventArgs)sharedQueue.Dequeue();
                        }
                        if (deliverEventArgs != null)
                        {
                            HandleMessageDelivery(deliverEventArgs);
                        }
                    }
                    catch (EndOfStreamException)
                    {
                        // do nothing here, EOS fired when queue is closed
                        // Looks like the connection has gone away, so wait a little while
                        // before continuing to poll the queue
                        Thread.Sleep(10);
                    }
                }
            });
            subscriptionCallbackThread.Start();
        }
コード例 #21
0
 /// <summary>
 /// Dequeues this instance.
 /// </summary>
 /// <returns></returns>
 public object Dequeue()
 {
     return(_sharedQueue.Dequeue());
 }
コード例 #22
0
 public void Dequeue()
 {
     m_q.Dequeue();
 }
コード例 #23
0
        /// <summary>
        /// Dequeues events from shared memory
        /// </summary>
        internal void Listener()
        {
            WspEvent   wspEvent;
            DateTime   nextPushSubscriptions = DateTime.UtcNow.AddMinutes(subscriptionRefreshIncrement);
            ReturnCode rc;

            try
            {
                Thread.CurrentThread.Priority = ThreadPriority.Highest;

                byte[] buffer = null;

                while (StopListening == false)
                {
                    try
                    {
                        buffer = eventQueue.Dequeue(Timeout);

                        if (buffer != null)
                        {
                            try
                            {
                                wspEvent = new WspEvent(buffer);
                            }
                            catch (Exception e)
                            {
                                EventLog.WriteEntry("WspEventRouter", "Event has invalid format:  " + e.ToString(), EventLogEntryType.Error);

                                continue;
                            }

                            List <WspEventObservable> observables;

                            if (WspEventObservable.eventObservables.TryGetValue(wspEvent.EventType, out observables) == true)
                            {
                                for (int i = 0; i < observables.Count; i++)
                                {
                                    observables[i].queue.Enqueue(wspEvent, wspEvent.SerializedEvent.Length);
                                }
                            }
                        }

                        if (DateTime.UtcNow > nextPushSubscriptions)
                        {
                            try
                            {
                                foreach (Guid subId in subscriptions.Keys)
                                {
                                    foreach (string expression in subscriptions[subId].Keys)
                                    {
                                        WspEvent subEvent = new WspEvent(Subscription.SubscriptionEvent, null, subscriptions[subId][expression].Serialize());

                                        publishMgr.Publish(subEvent.SerializedEvent, out rc);
                                    }
                                }

                                nextPushSubscriptions = DateTime.UtcNow.AddMinutes(subscriptionRefreshIncrement);
                            }
                            catch
                            {
                                // intentionally left blank
                                // it will retry next time
                            }
                        }
                    }
                    catch (PubSubException e)
                    {
                        EventLog.WriteEntry("WspEventRouter", "Exception occurred processing event from shared queue: " + e.ToString(), EventLogEntryType.Error);

                        continue;
                    }
                    catch (Exception e)
                    {
                        EventLog.WriteEntry("WspEventRouter", "Exception occurred processing event from shared queue: " + e.ToString(), EventLogEntryType.Error);

                        continue;
                    }
                }
            }
            catch (ThreadAbortException)
            {
                // Another thread has signalled that this worker
                // thread must terminate.  Typically, this occurs when
                // the main service thread receives a service stop
                // command.
            }
            catch (AccessViolationException)
            {
                // This can occur after the thread has been stopped and the runtime is doing GC.
                // Just let the thread quit to end listening.
            }
            catch (SharedQueueException e)
            {
                throw new PubSubException(e.Message, e.InnerException);
            }
        }
コード例 #24
0
 static void Consume(object obj)
 {
     Console.WriteLine($"Thread #{Thread.CurrentThread.ManagedThreadId} consumes the {sharedQueue.Dequeue()}");
 }