次の方法で共有


Azure Queue Storage と Visual Studio 接続サービスの使い始め (クラウド サービス プロジェクト)

ヒント

Microsoft Azure Storage Explorer を試す

Microsoft Azure ストレージ エクスプローラーは、Windows、macOS、Linux で Azure Storage のデータを視覚的に操作できる Microsoft 製の無料のスタンドアロン アプリです。

概要

重要

Cloud Services (クラシック) は、2024 年 9 月 1 日をもって、すべてのお客様に対して非推奨になりました。 実行中の既存のデプロイはすべて Microsoft によって停止およびシャットダウンされ、2024 年 10 月以降、そのデータは永久に失われます。 新しいデプロイでは、新しい Azure Resource Manager ベースのデプロイ モデル、 Azure Cloud Services (延長サポート) を使用してください。

この記事では、Visual Studio 接続済みサービスの追加 ダイアログを使用して、クラウド サービス プロジェクトで Azure ストレージ アカウントを作成または参照した後で、Visual Studio で Azure Queue Storage の使用を開始する方法について説明します。

コードでキューを作成する方法について説明します。 また、キュー メッセージの追加、変更、読み取り、削除など、基本的なキュー操作を実行する方法についても説明します。 サンプルは C# コードで記述され、.NET 用 Microsoft Azure Storage クライアント ライブラリ使用します。

接続済みサービスの追加 操作では、プロジェクト内の Azure Storage にアクセスするための適切な NuGet パッケージがインストールされ、ストレージ アカウントの接続文字列がプロジェクト構成ファイルに追加されます。

Azure Queue Storage は、HTTP または HTTPS を使用して認証された呼び出しを介して世界中のどこからでもアクセスできる多数のメッセージを格納するためのサービスです。 1 つのキュー メッセージのサイズは最大 64 KB で、キューにはストレージ アカウントの合計容量制限まで、数百万のメッセージを含めることができます。

コード内のキューにアクセスする

Visual Studio Cloud Services プロジェクトのキューにアクセスするには、Azure Queue Storage にアクセスする C# ソース ファイルに次の項目を含める必要があります。

  1. C# ファイルの先頭にある名前空間宣言が、これらの の using ステートメントを含んでいることを確認してください。

    using Microsoft.Framework.Configuration;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Queue;
    
  2. ストレージ アカウント情報を表す CloudStorageAccount オブジェクトを取得します。 次のコードを使用して、Azure サービス構成からストレージ接続文字列とストレージ アカウント情報を取得します。

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("<storage-account-name>_AzureStorageConnectionString"));
    
  3. CloudQueueClient オブジェクトを取得して、ストレージ アカウント内のキュー オブジェクトを参照します。

    // Create the queue client.
    CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
    
  4. 特定のキューを参照する CloudQueue オブジェクトを取得します。

    // Get a reference to a queue named "messageQueue"
    CloudQueue messageQueue = queueClient.GetQueueReference("messageQueue");
    

注意: 次のサンプルのコードの前で、上記のすべてのコードを使用します。

コードでキューを作成する

コードでキューを作成するには、CreateIfNotExists 呼び出しを追加するだけです。

// Create the CloudQueue if it does not exist
messageQueue.CreateIfNotExists();

キューにメッセージを追加する

メッセージを既存のキューに挿入するには、CloudQueueMessage オブジェクト 新しいオブジェクトを作成し、AddMessage メソッドを呼び出します。

CloudQueueMessage オブジェクトは、文字列 (UTF-8 形式) またはバイト配列から作成できます。

"Hello, World" というメッセージを挿入する例を次に示します。

// Create a message and add it to the queue.
CloudQueueMessage message = new CloudQueueMessage("Hello, World");
messageQueue.AddMessage(message);

キュー内のメッセージを読み取る

PeekMessage メソッドを呼び出すことで、キューからメッセージを削除せずに、キューの先頭にあるメッセージをピークできます。

// Peek at the next message
CloudQueueMessage peekedMessage = messageQueue.PeekMessage();

キュー内のメッセージの読み取りと削除

コードは、2 つの手順でキューからメッセージを削除 (キュー解除) できます。

  1. GetMessage を呼び出して、キュー内の次のメッセージを取得してください。 GetMessage から返されたメッセージ は、このキューからメッセージを読み取る他のコードからは見えなくなります。 既定では、このメッセージは 30 秒間非表示のままです。
  2. キューからのメッセージの削除を完了するには、DeleteMessage 呼び出します。

メッセージを削除するこの 2 段階のプロセスにより、ハードウェアまたはソフトウェアの障害が原因でコードでメッセージの処理が失敗した場合、コードの別のインスタンスが同じメッセージを取得して、もう一度やり直すことができます。 次のコードは、メッセージ 処理された直後に DeleteMessage を呼び出します。

// Get the next message in the queue.
CloudQueueMessage retrievedMessage = messageQueue.GetMessage();

// Process the message in less than 30 seconds

// Then delete the message.
await messageQueue.DeleteMessage(retrievedMessage);

キュー メッセージの処理と削除に追加のオプションを使用する

キューからのメッセージ取得をカスタマイズする方法は 2 つあります。

  • メッセージのバッチを取得できます (最大 32)。
  • 非表示タイムアウトを長くまたは短く設定できるため、コードで各メッセージを完全に処理する時間を増減できます。 次のコード例では、GetMessages メソッドを使用して、1 回の呼び出しで 20 個のメッセージを取得します。 次に、foreach ループを使用して各メッセージを処理します。 また、各メッセージの非表示タイムアウトを 5 分に設定します。 5 分はすべてのメッセージに対して同時に開始されるため、getMessages の呼び出しから 5 分が経過すると、削除されていないメッセージが再び表示されます。

次に例を示します。

foreach (CloudQueueMessage message in messageQueue.GetMessages(20, TimeSpan.FromMinutes(5)))
{
    // Process all messages in less than 5 minutes, deleting each message after processing.

    // Then delete the message after processing
    messageQueue.DeleteMessage(message);

}

キューの長さを取得する

キュー内のメッセージ数の見積もりを取得できます。 FetchAttributes メソッドは、メッセージ数を含むキュー属性を取得するように Queue サービスに要求します。 ApproximateMethodCount プロパティは、Queue サービスを呼び出さずに、FetchAttributes メソッドによって取得された最後の値を返します。

// Fetch the queue attributes.
messageQueue.FetchAttributes();

// Retrieve the cached approximate message count.
int? cachedMessageCount = messageQueue.ApproximateMessageCount;

// Display number of messages.
Console.WriteLine("Number of messages in queue: " + cachedMessageCount);

一般的な Azure Queue API で Async-Await パターンを使用する

この例では、一般的な Azure Queue API で Async-Await パターンを使用する方法を示します。 このサンプルでは、指定された各メソッドの非同期バージョンを呼び出します。これは、各メソッドの修正後の Async で確認できます。 非同期メソッドを使用すると、async-await パターンは呼び出しが完了するまでローカル実行を中断します。 この動作により、現在のスレッドは、パフォーマンスのボトルネックを回避し、アプリケーションの全体的な応答性を向上させるために役立つ他の作業を実行できます。 .NET で Async-Await パターンを使用する方法の詳細については、「async と Await (C# および Visual Basic) を参照してください。

// Create a message to put in the queue
CloudQueueMessage cloudQueueMessage = new CloudQueueMessage("My message");

// Add the message asynchronously
await messageQueue.AddMessageAsync(cloudQueueMessage);
Console.WriteLine("Message added");

// Async dequeue the message
CloudQueueMessage retrievedMessage = await messageQueue.GetMessageAsync();
Console.WriteLine("Retrieved message with content '{0}'", retrievedMessage.AsString);

// Delete the message asynchronously
await messageQueue.DeleteMessageAsync(retrievedMessage);
Console.WriteLine("Deleted message");

キューを削除する

キューとそのキューに含まれるすべてのメッセージを削除するには、キュー オブジェクトの Delete メソッドを呼び出します。

// Delete the queue.
messageQueue.Delete();

次のステップ

Azure キュー ストレージの基本を学習したので、これらのリンクに従って、より複雑なストレージ タスクについて学習します。

  • .NET 用 Azure Storage クライアント ライブラリ のキュー サービス リファレンス ドキュメントを参照して、使用可能な API の詳細を確認してください。
  • キュー ストレージの使用の詳細については、「.NET を使用した Azure Queue Storage の概要」を参照してください
  • Azure Storage で使用するコードを簡素化する方法については、「Azure WebJobs SDK」を参照してください。
  • Azure にデータを格納するためのその他のオプションについては、その他の機能ガイドをご覧ください。
    • Azure Storage テーブルを使用するには、「.NET を使用した Azure Table Storage の概要」参照してください。
    • Azure Storage BLOB を使用するには、「.NETを使用して Azure Blob Storage の使用を開始します。
    • リレーショナル データを格納するには、「.NET (C#)を使用した SQL Database への接続」を参照してください。