Creare e gestire Azure Queue Storage e i messaggi utilizzando .NET

Completato

In questa lezione viene illustrato come creare code e gestire i messaggi in Azure Queue Storage mostrando dei frammenti di codice da un progetto .NET.

Gli esempi di codice si basano sui pacchetti NuGet seguenti:

Creare il client del servizio di coda

La classe QueueClient consente di recuperare le code archiviate nello storage delle code. Ecco un modo per creare il client del servizio:

QueueClient queueClient = new QueueClient(connectionString, queueName);

Creare una coda

Questo esempio mostra come creare una coda se non esiste già:

// 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();

Inserire un messaggio in una coda

Per inserire un messaggio in una coda esistente, chiamare il metodo SendMessage. Un messaggio può essere una stringa (in formato UTF-8) o una matrice di byte. Il codice seguente crea una coda (se non esiste) e inserisce un messaggio:

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

Visualizzare il messaggio successivo

È possibile visualizzare i messaggi nella coda senza rimuoverli dalla coda chiamando il metodo PeekMessages. Se non si passa un valore per il parametro maxMessages, l'impostazione predefinita consiste nel visualizzare un messaggio.

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

Modificare il contenuto di un messaggio in coda

È possibile modificare il contenuto di un messaggio direttamente nella coda. Se il messaggio rappresenta un'attività di lavoro, è possibile usare questa funzionalità per aggiornare lo stato dell'attività di lavoro. Il codice seguente aggiorna il messaggio della coda con nuovi contenuti e imposta il timeout di visibilità per estendere altri 60 secondi. In questo modo viene salvato lo stato di lavoro associato al messaggio e viene restituito un altro minuto al client per continuare a lavorare sul messaggio.

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

Estrai il prossimo messaggio

Rimuovere un messaggio da una coda in due passaggi. Quando si chiama ReceiveMessages, si riceve il messaggio successivo nella coda. Un messaggio restituito da ReceiveMessages diventa invisibile per qualsiasi altro codice che legge i messaggi da questa coda. Per impostazione predefinita, questo messaggio rimane invisibile per 30 secondi. Per completare la rimozione del messaggio dalla coda, è necessario chiamare anche DeleteMessage. Questo processo in due passaggi di rimozione di un messaggio assicura che se il codice non riesce a elaborare un messaggio a causa di un errore hardware o software, un'altra istanza del codice può ottenere lo stesso messaggio e riprovare. Il tuo codice chiama DeleteMessage subito dopo l'elaborazione del messaggio.

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

Ottenere la lunghezza della coda

È possibile ottenere una stima del numero di messaggi in una coda. Il metodo GetProperties restituisce le proprietà della coda, incluso il conteggio dei messaggi. La proprietà ApproximateMessagesCount contiene il numero approssimativo di messaggi nella coda. Questo numero non è inferiore al numero effettivo di messaggi nella coda, ma potrebbe essere superiore.

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

Eliminare una coda

Per eliminare una coda e tutti i messaggi contenuti, chiamare il metodo Delete sull'oggetto queue.

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