Creare e gestire messaggi di Archiviazione code di Azure usando .NET

Completato

In questa unità viene illustrato come creare code e gestire i messaggi in Archiviazione code di Azure mostrando frammenti di codice di un progetto .NET.

Gli esempi di codice si basano sui pacchetti NuGet seguenti:

Creare il client del servizio di accodamento

La classe QueueClient consente di recuperare le code archiviate in Archiviazione code. Ecco come creare il client del servizio:

QueueClient queueClient = new QueueClient(connectionString, queueName);

Crea una coda

Questo esempio illustra 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 un'anteprima del messaggio nella coda senza rimuoverlo chiamando il metodo PeekMessages. Se non si passa un valore per il parametro maxMessages, per impostazione predefinita viene visualizzata un'anteprima di 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();
}

Cambiare il contenuto di un messaggio in coda

È possibile modificare il contenuto di un messaggio sul posto 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 nuovo contenuto e imposta il timeout di visibilità per estendere altri 60 secondi. In questo modo, lo stato del lavoro associato al messaggio viene salvato e il client può continuare a lavorare al messaggio per un altro minuto.

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

Rimuovere il messaggio successivo dalla coda

Rimuovere un messaggio da una coda in due passaggi. Quando si chiama ReceiveMessages, viene visualizzato il messaggio successivo in una coda. Un messaggio restituito da ReceiveMessages diventa invisibile a qualsiasi altro elemento di codice che legge i messaggi di 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 per la rimozione di un messaggio garantisce 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 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);
}

Recuperare 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 numero 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 che contiene, chiamare il metodo Delete sull'oggetto coda.

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