Rhino.Queues.QueueManager.PurgeProcessedMessagesInQueue C# (CSharp) Method

PurgeProcessedMessagesInQueue() private method

private PurgeProcessedMessagesInQueue ( string queue ) : void
queue string
return void
        private void PurgeProcessedMessagesInQueue(string queue)
        {
            // To make this batchable:
            // 1: Move to the end of the history (to the newest messages) and seek 
            //    backword by NumberOfMessagesToKeepInProcessedHistory.
            // 2: Save a bookmark of the current position.
            // 3: Delete from the beginning of the table (oldest messages) in batches until 
            //    a) we reach the bookmark or b) we hit OldestMessageInProcessedHistory.
            MessageBookmark purgeLimit = null;
            int numberOfMessagesToKeep = Configuration.NumberOfMessagesToKeepInProcessedHistory;
            if (numberOfMessagesToKeep > 0)
            {
                queueStorage.Global(actions =>
                {
                    var queueActions = actions.GetQueue(queue);
                    purgeLimit = queueActions.GetMessageHistoryBookmarkAtPosition(numberOfMessagesToKeep);
                    actions.Commit();
                });

                if (purgeLimit == null)
                    return;
            }

            bool foundMessages = false;
            do
            {
                foundMessages = false;
                queueStorage.Global(actions =>
                {
                    var queueActions = actions.GetQueue(queue);
                    var messages = queueActions.GetAllProcessedMessages(batchSize: 250)
                        .TakeWhile(x => (purgeLimit == null || !x.Bookmark.Equals(purgeLimit))
                            && (DateTime.Now - x.SentAt) > Configuration.OldestMessageInProcessedHistory);

                    foreach (var message in messages)
                    {
                        foundMessages = true;
                        logger.DebugFormat("Purging message {0} from queue {1}/{2}", message.Id, message.Queue, message.SubQueue);
                        queueActions.DeleteHistoric(message.Bookmark);
                    }

                    actions.Commit();
                });
            } while (foundMessages);
        }