Creación y administración de Azure Queue Storage y mensajes mediante .NET

Completado

En esta unidad se explica cómo crear colas y administrar mensajes en Azure Queue Storage mostrando fragmentos de código de un proyecto de .NET.

Los ejemplos de código se basan en los siguientes paquetes NuGet:

Creación del cliente de Queue Service

La clase QueueClient permite recuperar las colas almacenadas en Queue Storage. Esta es una forma de crear el cliente de servicio:

QueueClient queueClient = new QueueClient(connectionString, queueName);

Creación de una cola

En este ejemplo se muestra cómo crear una cola si todavía no existe:

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to create and manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

// Create the queue
queueClient.CreateIfNotExists();

Insertar un mensaje en una cola

Para insertar un mensaje en una cola existente, llame al método SendMessage. Un mensaje puede ser una cadena (en formato UTF-8) o una matriz de bytes. El código siguiente crea una cola (si no existe) e inserta un mensaje:

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to create and manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

// Create the queue if it doesn't already exist
queueClient.CreateIfNotExists();

if (queueClient.Exists())
{
    // Send a message to the queue
    queueClient.SendMessage(message);
}

Echar un vistazo al siguiente mensaje

Puede ver los mensajes de la cola sin quitarlos de la cola llamando al PeekMessagesmétodo. Si no pasa un valor para el maxMessages parámetro, el valor predeterminado es examinar un mensaje.

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{ 
    // Peek at the next message
    PeekedMessage[] peekedMessage = queueClient.PeekMessages();
}

Cambia el contenido de un mensaje en cola

Puede cambiar el contenido de un mensaje directamente en la cola. Si el mensaje representa una tarea de trabajo, puede usar esta característica para actualizar el estado de la tarea de trabajo. El código siguiente actualiza el mensaje de cola con nuevo contenido y establece el tiempo de espera de visibilidad para extender otros 60 segundos. Esto guarda el estado de trabajo asociado al mensaje y proporciona al cliente otro minuto para seguir trabajando en el mensaje.

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    // Get the message from the queue
    QueueMessage[] message = queueClient.ReceiveMessages();

    // Update the message contents
    queueClient.UpdateMessage(message[0].MessageId, 
            message[0].PopReceipt, 
            "Updated contents",
            TimeSpan.FromSeconds(60.0)  // Make it invisible for another 60 seconds
        );
}

Extracción del siguiente mensaje de la cola

Elimine un mensaje de una cola en dos pasos. Al llamar a ReceiveMessages, obtendrá el siguiente mensaje en una cola. Un mensaje devuelto por ReceiveMessages se vuelve invisible para cualquier otro código que lea mensajes de esta cola. De forma predeterminada, este mensaje permanece invisible durante 30 segundos. Para terminar de quitar el mensaje de la cola, también debe llamar a DeleteMessage. Este proceso de extracción de un mensaje que consta de dos pasos garantiza que si su código no puede procesar un mensaje a causa de un error de hardware o software, otra instancia de su código puede obtener el mismo mensaje e intentarlo de nuevo. Tu código llama a DeleteMessage justo después de haberse procesado el mensaje.

// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    // Get the next message
    QueueMessage[] retrievedMessage = queueClient.ReceiveMessages();

    // Process (i.e. print) the message in less than 30 seconds
    Console.WriteLine($"Dequeued message: '{retrievedMessage[0].Body}'");

    // Delete the message
    queueClient.DeleteMessage(retrievedMessage[0].MessageId, retrievedMessage[0].PopReceipt);
}

Obtén la longitud de la cola

Puede obtener una estimación del número de mensajes existentes en una cola. El método GetProperties devuelve propiedades de cola, incluido el recuento de mensajes. La propiedad ApproximateMessagesCount contiene el número aproximado de mensajes en la cola. Este número no es menor que el número real de mensajes de la cola, pero podría ser mayor.

/// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    QueueProperties properties = queueClient.GetProperties();

    // Retrieve the cached approximate message count.
    int cachedMessagesCount = properties.ApproximateMessagesCount;

    // Display number of messages.
    Console.WriteLine($"Number of messages in queue: {cachedMessagesCount}");
}

Eliminación de una cola

Para eliminar una cola y todos los mensajes contenidos en ella, llame al método Delete en el objeto de cola.

/// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];

// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);

if (queueClient.Exists())
{
    // Delete the queue
    queueClient.Delete();
}