Exemplo n.º 1
0
    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);
    }
Exemplo n.º 2
0
    /// <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);
            }
        }
    }