CloudQueue GetQueueReference(AzureQueueAccessInformation accessInfo) { var creds = new StorageCredentials(accessInfo.Token); var uri = new Uri(accessInfo.StorageUri.PrimaryUri); var client = new CloudQueueClient(uri, creds); var queue = client.GetQueueReference(accessInfo.QueueName); return(queue); }
/// <summary> /// The MonitorQueue method fetches and processes messages from the queue that is identified by calling GetQueueAccessInformation. /// It will continue to process messages until ContinueMonitoring returns false. /// The ProcessMessage delegate is used to process each message, and if the processing fails, the OnError delegate is called. /// Both ProcessMessage and OnError should return TRUE to indicate that the message should be deleted from the queue. /// </summary> public void MonitorQueue() { AzureQueueAccessInformation accessInfo = null; while (ContinueMonitoring == null || ContinueMonitoring()) { // If we don't have valid queue access information then get some if (accessInfo == null || DateTime.UtcNow.AddHours(-1) > accessInfo.Expires) { try { accessInfo = GetQueueAccessInformation(); queue = null; } catch (AggregateException ex) { // If we have an error handler, then delegate to it if (OnError != null) { OnError(ex.InnerException, null); } return; // Abort } } // Get a reference to the Azure queue if (queue == null) { queue = GetQueueReference(accessInfo); } // Process the next message var message = queue.GetMessage(); if (message != null) { var delete = ProcessMessage(message); if (delete) { queue.DeleteMessage(message); } } // Wait a little bit before checking the queue again if we didn't // get a message if (message == null) { Thread.Sleep(1000); } } }