.NET バージョン 11.x クライアント ライブラリを使用する Azure Queue Storage のコード サンプル
この記事では、.NET 用の Azure Queue Storage クライアント ライブラリのバージョン 11.x を使用するコード サンプルを示します。
2023 年 3 月 31 日に、現在の Azure SDK ガイドラインに準拠していない Azure SDK ライブラリのサポートは廃止されました。 新しい Azure SDK ライブラリは、一貫したエクスペリエンスを促進し、セキュリティ態勢を強化するために定期的に更新されます。 新しい機能と重要なセキュリティ更新を利用するために、新しい Azure SDK ライブラリに移行することをお勧めします。
以前のライブラリは 2023 年 3 月 31 日以降も引き続き使用できますが、Microsoft から公式のサポートと更新情報は提供されなくなります。 詳細については、サポート廃止のお知らせに関するページを参照してください。
最新バージョンの 12.x クライアント ライブラリ バージョンを使用するコード サンプルについては、「クイック スタート: .NET 用 Azure Queue Storage クライアント ライブラリ」 を参照してください。
Queue Storage クライアントを作成する
CloudQueueClient
クラスを使用すると、Queue Storage に格納されているキューを取得できます。 サービス クライアントを作成する方法の 1 つを次に示します。
// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
キューを作成する
この例では、キューを作成する方法を示します。
// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");
// Create the queue if it doesn't already exist
queue.CreateIfNotExists();
メッセージをキューに挿入する
既存のキューにメッセージを挿入するには、最初に新しい CloudQueueMessage
を作成します。 次に、AddMessage
メソッドを呼び出します。 CloudQueueMessage
は、文字列 (UTF-8 形式) またはバイト配列で作成できます。 次のコード例では、キューが作成され (それがまだ存在しない場合)、メッセージ Hello, World
が挿入されます。
// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");
// Create the queue if it doesn't already exist
queue.CreateIfNotExists();
// Create a message and add it to the queue
CloudQueueMessage message = new CloudQueueMessage("Hello, World");
queue.AddMessage(message);
次のメッセージをピークする
PeekMessage
メソッドを呼び出すと、キューの先頭にあるメッセージをキューから削除せずにピークできます。
// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");
// Peek at the next message
CloudQueueMessage peekedMessage = queue.PeekMessage();
// Display message.
Console.WriteLine(peekedMessage.AsString);
キューに配置されたメッセージの内容を変更する
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");
// Get the message from the queue and update the message contents.
CloudQueueMessage message = queue.GetMessage();
message.SetMessageContent2("Updated contents.", false);
queue.UpdateMessage(message,
TimeSpan.FromSeconds(60.0), // Make it invisible for another 60 seconds.
MessageUpdateFields.Content | MessageUpdateFields.Visibility);
次のメッセージをデキューする
コードでは、2 つの手順でキューからメッセージをデキューします。 GetMessage
を呼び出すと、キュー内の次のメッセージを取得します。 GetMessage
から返されたメッセージは、このキューからメッセージを読み取る他のコードから参照できなくなります。 既定では、このメッセージを参照できない状態は 30 秒間続きます。 また、キューからのメッセージの削除を完了するには、DeleteMessage
を呼び出す必要があります。 このようにメッセージを 2 つの手順で削除することで、ハードウェアまたはソフトウェアの問題が原因でコードによるメッセージの処理が失敗した場合に、コードの別のインスタンスで同じメッセージを取得し、もう一度処理することができます。 ご自分のコードで、メッセージが処理された直後に DeleteMessage
を呼び出します。
// Retrieve storage account from connection string
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");
// Get the next message
CloudQueueMessage retrievedMessage = queue.GetMessage();
//Process the message in less than 30 seconds, and then delete the message
queue.DeleteMessage(retrievedMessage);
Async-Await パターンを一般的な Queue Storage API で使用する
// Create the queue if it doesn't already exist
if(await queue.CreateIfNotExistsAsync())
{
Console.WriteLine("Queue '{0}' Created", queue.Name);
}
else
{
Console.WriteLine("Queue '{0}' Exists", queue.Name);
}
// Create a message to put in the queue
CloudQueueMessage cloudQueueMessage = new CloudQueueMessage("My message");
// Async enqueue the message
await queue.AddMessageAsync(cloudQueueMessage);
Console.WriteLine("Message added");
// Async dequeue the message
CloudQueueMessage retrievedMessage = await queue.GetMessageAsync();
Console.WriteLine("Retrieved message with content '{0}'", retrievedMessage.AsString);
// Async delete the message
await queue.DeleteMessageAsync(retrievedMessage);
Console.WriteLine("Deleted message");
メッセージをデキューするためのその他のオプションを使用する
次のコード例では、GetMessages
メソッドを使用して、1 回の呼び出しで 20 個のメッセージを取得します。 その後、foreach
ループを使用して、各メッセージを処理します。 また、各メッセージの非表示タイムアウトを 5 分に設定します。 タイムアウトは、すべてのメッセージに対して同時に開始されます。そのため、GetMessages
の呼び出しから 5 分が経過すると、削除されていないすべてのメッセージが再び表示されます。
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");
foreach (CloudQueueMessage message in queue.GetMessages(20, TimeSpan.FromMinutes(5)))
{
// Process all messages in less than 5 minutes, deleting each message after processing.
queue.DeleteMessage(message);
}
キューの長さを取得する
キュー内のメッセージの概数を取得できます。 FetchAttributes
メソッドからは、メッセージ数をはじめとするキューの属性が返されます。 ApproximateMessageCount
プロパティを使用することで、Queue Storage を呼び出さずに、FetchAttributes
メソッドによって取得された最後の値を返します。
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");
// Fetch the queue attributes.
queue.FetchAttributes();
// Retrieve the cached approximate message count.
int cachedMessageCount = queue.ApproximateMessageCount;
// Display number of messages.
Console.WriteLine("Number of messages in queue: " + cachedMessageCount);
キューを削除する
キューおよびキューに格納されているすべてのメッセージを削除するには、キュー オブジェクトの Delete
メソッドを呼び出します。
// Retrieve storage account from connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the queue client.
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("myqueue");
// Delete the queue.
queue.Delete();
キューを操作する
関連記事: .NET で Azure Queue Storage キューを操作する
プロジェクト ディレクトリ内で、dotnet add package
コマンドを使用して次のパッケージを追加します。
dotnet add package Microsoft.Azure.Storage.Common
dotnet add package Microsoft.Azure.Storage.Queue
完全なコード例:
using System;
using System.Threading.Tasks;
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Queue;
namespace QueueApp
{
class Program
{
static async Task Main(string[] args)
{
string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference("mystoragequeue");
if (args.Length > 0)
{
string value = String.Join(" ", args);
await InsertMessageAsync(queue, value);
Console.WriteLine($"Sent: {value}");
}
else
{
string value = await RetrieveNextMessageAsync(queue);
Console.WriteLine($"Received: {value}");
}
Console.Write("Press Enter...");
Console.ReadLine();
}
static async Task InsertMessageAsync(CloudQueue theQueue, string newMessage)
{
if (await theQueue.CreateIfNotExistsAsync())
{
Console.WriteLine("The queue was created.");
}
CloudQueueMessage message = new CloudQueueMessage(newMessage);
await theQueue.AddMessageAsync(message);
}
static async Task<string> RetrieveNextMessageAsync(CloudQueue theQueue)
{
bool exists = await theQueue.ExistsAsync();
if (exists)
{
CloudQueueMessage retrievedMessage = await theQueue.GetMessageAsync();
if (retrievedMessage != null)
{
string theMessage = retrievedMessage.AsString;
await theQueue.DeleteMessageAsync(retrievedMessage);
return theMessage;
}
else
{
Console.Write("The queue is empty. Attempt to delete it? (Y/N) ");
string response = Console.ReadLine();
if (response.ToUpper() == "Y")
{
await theQueue.DeleteIfExistsAsync();
return "The queue was deleted.";
}
else
{
return "The queue was not deleted.";
}
}
}
else
{
return "The queue does not exist. Add a message to the command line to create the queue and store the message.";
}
}
}
}