Example #1
0
        /// <summary>
        /// This task runs continuously, waiting for new messages.  The task will pend on a semaphore when
        /// the maximum number of active messages has been reached.
        /// </summary>
        private void RunLimitedConsumeTask()
        {
            while (true)
            {
                limitedConsumeSempahore.Take();

                BasicGetResult result;

                do
                {
                    result = Channel.BasicGet(queue: Name, autoAck: autoAcknowledgeMessages);

                    if (result == null)
                    {
                        // Wait before checking again.
                        //TODO: Not the smartest way to do this.  Is there a better way?
                        Thread.Sleep(1000);
                    }
                } while (result == null);

                var wrapper = MessageEnvelope.Deserialize(result.Body.ToArray(), result, this.ParentMessageClient);

                //MessageBase message = MessageBase.Deserialize(wrapper, result, this.ParentMessageClient);

                FireMessageReceivedEvent(wrapper);
            }
        }
        public void GiveTakeTest()
        {
            var sem = new SimpleCountingSemaphore(3, 0);

            sem.Take();
            Assert.AreEqual(sem.Count, 1);
            sem.Take();
            Assert.AreEqual(sem.Count, 2);
            sem.Take();
            Assert.AreEqual(sem.Count, 3);

            var result = sem.TryTake();

            Assert.IsFalse(result);
            Assert.AreEqual(sem.Count, 3);

            Timer timer = new Timer(200);

            timer.Elapsed += (sender, e) => sem.Give();
            timer.Start();

            sem.Take();
            Assert.AreEqual(sem.Count, 3);

            sem.Give();
            Assert.AreEqual(sem.Count, 2);
            sem.Give();
            Assert.AreEqual(sem.Count, 1);
            sem.Give();
            Assert.AreEqual(sem.Count, 0);
            sem.Give();
            Assert.AreEqual(sem.Count, 0);

            sem.Dispose();
            CatchExceptionHelper.VerifyExceptionCaught <ObjectDisposedException>(() => sem.Take());
        }