Пример #1
0
        public object GetNextMessage(QueueContext context)
        {
            lock (this)
            {
                QueueItem result = null;

                if (context.LastSentItem == null)
                {
                    // Send oldest message to this new client.
                    result = this.OldestItem;
                }
                else if (context.LastSentItem.Next != null)
                {
                    // This means there is a new message in the queue that arrived
                    // after what we previously sent.
                    // return that message:
                    result = context.LastSentItem.Next;
                }
                else
                {
                    if (this.LastInsertedItem == context.LastSentItem)
                    {
                        // Client is then up-to-date.
                        result = null;
                    }
                    else
                    {
                        // What we previously sent is now outdated.
                        // context.LastSentItem.Next is null when the message leaves the queue.
                        // In that case, just return the oldest element.
                        result = this.OldestItem;
                    }
                }

                if (result == null)
                {
                    return(null);
                }

                context.LastSentItem = result;
                return(result.Message);
            }
        }
Пример #2
0
        private void AddQueueIntern(Queue queue)
        {
            QueueContext context = new QueueContext(queue);

            if (this.Head.Queue.QueueOptions.Quota <= queue.QueueOptions.Quota)
            {
                context.Next = this.Head;
                this.Head    = context;
                return;
            }

            QueueContext parent = this.Head;

            while (parent.Next != null)
            {
                if (queue.QueueOptions.Quota >= parent.Next.Queue.QueueOptions.Quota)
                {
                    break;
                }
            }

            context.Next = parent.Next;
            parent.Next  = context;
        }