Создание Хранилища очередей Azure и сообщений и управление ими с помощью .NET
В этом уроке мы рассмотрим, как создавать очереди и управлять сообщениями в очереди Azure служба хранилища, показывая фрагменты кода из проекта .NET.
Примеры кода основываются на следующих пакетах NuGet:
- Библиотека Azure.Core для .NET — этот пакет содержит общие примитивы, абстракции и вспомогательные методы для современных клиентских библиотек пакета SDK для .NET.
- Клиентская библиотека Azure.Storage.Common для .NET — этот пакет содержит инфраструктуру, совместно используемую другими клиентскими библиотеками службы хранилища Azure.
- Azure. служба хранилища. Клиентская библиотека очередей для .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();
}