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