Criar e gerenciar o Armazenamento de Filas do Azure e mensagens usando o .NET
Nesta unidade, abordaremos como criar filas e gerenciar mensagens no Armazenamento de Filas do Azure mostrando trechos de código de um projeto .NET.
Os exemplos de código dependem dos seguintes pacotes NuGet:
- Biblioteca Azure.Core para .NET: este pacote fornece primitivas, abstrações e auxiliares compartilhados para bibliotecas de cliente modernas do SDK do .NET Azure.
- Biblioteca de cliente Azure.Storage.Common para .NET: este pacote fornece infraestrutura compartilhada pelas outras bibliotecas de cliente do Armazenamento do Azure.
- Biblioteca de cliente Azure.Storage.Queues para .NET: este pacote permite trabalhar com o Armazenamento de Filas do Azure para armazenar mensagens acessadas por um cliente.
- Biblioteca System.Configuration.ConfigurationManager para .NET: Este pacote fornece acesso a arquivos de configuração para aplicativos cliente.
Criar o cliente de serviço de fila
A classe QueueClient permite recuperar filas armazenadas no armazenamento de filas. Aqui está uma maneira de criar o cliente de serviço:
QueueClient queueClient = new QueueClient(connectionString, queueName);
Criar uma fila
Este exemplo mostra como criar uma fila se ela ainda não existir:
// 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();
Inserir uma mensagem numa fila
Para inserir uma mensagem em uma fila existente, chame o método SendMessage. Uma mensagem pode ser uma cadeia de caracteres (no formato UTF-8) ou uma matriz de bytes. O código a seguir cria uma fila (se ela não existir) e insere uma mensagem:
// 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);
}
Espreite a próxima mensagem
Você pode espiar as mensagens na fila sem removê-las da fila chamando o método PeekMessages. Se você não passar um valor para o parâmetro maxMessages, o padrão é espiar uma mensagem.
// 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();
}
Alterar o conteúdo de uma mensagem em fila
Você pode alterar o conteúdo de uma mensagem diretamente na fila. Se a mensagem representar uma tarefa de trabalho, você poderá usar esse recurso para atualizar o status da tarefa de trabalho. O código a seguir atualiza a mensagem de fila com novos conteúdos e define o tempo limite de visibilidade para estender mais 60 segundos. Isso salva o estado de trabalho associado à mensagem e dá ao cliente mais um minuto para continuar trabalhando na mensagem.
// 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
);
}
Retirar a próxima mensagem da fila
Remova uma mensagem da fila em duas etapas. Quando você liga para ReceiveMessages, você recebe a próxima mensagem em uma fila. Uma mensagem retornada do ReceiveMessages torna-se invisível para qualquer outro código que lê mensagens dessa fila. Por padrão, essa mensagem permanece invisível por 30 segundos. Para concluir a remoção da mensagem da fila, você também deve chamar DeleteMessage. Esse processo de duas etapas de remoção de uma mensagem garante que, se o código falhar ao processar uma mensagem devido a uma falha de hardware ou software, outra instância do código poderá receber a mesma mensagem e tentar novamente. O seu código chama DeleteMessage imediatamente após a mensagem ter sido processada.
// 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);
}
Obter o comprimento da fila
Você pode obter uma estimativa do número de mensagens em uma fila. O método GetProperties retorna propriedades de fila, incluindo a contagem de mensagens. A propriedade ApproximateMessagesCount contém o número aproximado de mensagens na fila. Esse número não é menor do que o número real de mensagens na fila, mas pode ser maior.
/// 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}");
}
Excluir uma fila
Para excluir uma fila e todas as mensagens contidas nela, chame o método Delete no objeto 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();
}