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); } }
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; }