Создание хранилища очередей Azure и сообщений и управление ими с помощью .NET
В этом уроке мы рассмотрим, как создавать очереди и управлять сообщениями в хранилище очередей Azure, показывая фрагменты кода из проекта .NET.
Примеры кода используют следующие пакеты NuGet:
- библиотека Azure.Core для .NET: этот пакет предоставляет общие базы, абстракции и вспомогательные инструменты для современных клиентских библиотек Azure SDK для .NET.
- клиентская библиотека Azure.Storage.Common для .NET. Этот пакет предоставляет инфраструктуру, общую другими клиентскими библиотеками службы хранилища Azure.
- клиентская библиотека Azure.Storage.Queues для .NET. Этот пакет позволяет работать с хранилищем очередей Azure для хранения сообщений, к которым обращается клиент.
- библиотеку System.Configuration.ConfigurationManager для .NET: этот пакет предоставляет доступ к файлам конфигурации для клиентских приложений.
Создание клиента службы очередей
Класс QueueClient
позволяет получать очереди, хранящиеся в хранилище очередей. Вот один из способов создания клиента службы:
QueueClient queueClient = new QueueClient(connectionString, queueName);
Создание очереди
В этом примере показано, как создать очередь, если она еще не существует:
// 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();
Вставка сообщения в очередь
Чтобы вставить сообщение в существующую очередь, вызовите метод SendMessage
. Сообщение может быть строкой (в формате UTF-8) или массивом байтов. Следующий код создает очередь (если она не существует) и вставляет сообщение:
// 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);
}
Глянуть на следующее сообщение
Вы можете просмотреть сообщения в очереди, не удаляя их из очереди, вызвав метод PeekMessages
. Если вы не передаете значение для параметра maxMessages
, по умолчанию необходимо просмотреть одно сообщение.
// 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();
}
Изменение содержимого сообщения в очереди
Содержимое сообщения можно изменить на месте в очереди. Если сообщение представляет рабочую задачу, эту функцию можно использовать для обновления состояния рабочей задачи. Следующий код обновляет сообщение очереди новым содержимым и устанавливает время невидимости еще на 60 секунд. Это сохраняет состояние работы, связанного с сообщением, и дает клиенту еще одну минуту, чтобы продолжить работу над сообщением.
// 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
);
}
Извлечь следующее сообщение
Извлечение сообщения из очереди в два этапа. При вызове ReceiveMessages
вы получите следующее сообщение в очереди. Сообщение, возвращаемое из ReceiveMessages
, становится невидимым для любого другого кода, считывающего сообщения из этой очереди. По умолчанию это сообщение остается невидимым в течение 30 секунд. Чтобы завершить удаление сообщения из очереди, необходимо также вызвать DeleteMessage
. Этот двухэтапный процесс удаления сообщения гарантирует, что если код не может обработать сообщение из-за сбоя оборудования или программного обеспечения, другой экземпляр кода может получить то же сообщение и повторить попытку. Код вызывает DeleteMessage
сразу после обработки сообщения.
// 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);
}
Получить длину очереди
Вы можете получить оценку количества сообщений в очереди. Метод GetProperties
возвращает свойства очереди, включая число сообщений. Свойство ApproximateMessagesCount
содержит приблизительное количество сообщений в очереди. Это число не ниже фактического количества сообщений в очереди, но может быть выше.
/// 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}");
}
Удаление очереди
Чтобы удалить очередь и все сообщения, содержащиеся в нем, вызовите метод Delete
в объекте очереди.
/// 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();
}