.NET を使用して Azure Queue Storage とメッセージを作成して管理する
このユニットでは、.NET プロジェクトからコード スニペットを表示することによって、Azure Queue Storage でキューを作成し、メッセージを管理する方法について説明します。
コード例では、次の NuGet パッケージを使用しています。
- .NET 用 Azure.Core ライブラリ: このパッケージには、最新の .NET Azure SDK クライアント ライブラリ用の共有プリミティブ、抽象化、およびヘルパーが用意されています。
- .NET 用 Azure.Storage.Common クライアント ライブラリ: このパッケージには、他の Azure Storage クライアント ライブラリによって共有されるインフラストラクチャが用意されています。
- .NET 用 Azure.Storage.Queues クライアント ライブラリ: このパッケージを使用すると、Azure Queue Storage を操作して、クライアントからアクセスされるメッセージを格納できます。
- .NET 用 System.Configuration.ConfigurationManager ライブラリ: このパッケージには、クライアント アプリケーション用の構成ファイルへのアクセス権が用意されています。
Queue サービス クライアントを作成する
QueueClient
クラスを使用すると、Queue Storage に格納されているキューを取得できます。 サービス クライアントを作成する方法の 1 つを次に示します。
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
パラメーターの値を渡さない場合、既定では 1 つのメッセージがピークされます。
// 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 秒延長します。 これにより、メッセージに関連付けられている作業の状態が保存され、クライアントにメッセージの操作を続行する時間が 1 分与えられます。
// 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
);
}
次のメッセージをデキューする
キューからのメッセージのデキューは、2 つの手順で行います。 ReceiveMessages
を呼び出すと、キュー内の次のメッセージを取得します。 ReceiveMessages
から返されたメッセージは、このキューからメッセージを読み取る他のコードから参照できなくなります。 既定では、このメッセージを参照できない状態は 30 秒間続きます。 また、キューからのメッセージの削除を完了するには、DeleteMessage
を呼び出す必要があります。 このようにメッセージを 2 つの手順で削除することで、ハードウェアまたはソフトウェアの問題が原因でコードによるメッセージの処理が失敗した場合に、コードの別のインスタンスで同じメッセージを取得し、もう一度処理することができます。 ご自分のコードで、メッセージが処理された直後に 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();
}