Azure Service Bus キューの使用を開始する (.NET)

このクイックスタートでは、次の手順を実行します。

  1. Azure Portal を使用して Service Bus 名前空間を作成する。
  2. Azure Portal を使用して Service Bus キューを作成する。
  3. キューに一連のメッセージを送信するための .NET Core コンソール アプリケーションを作成する。
  4. それらのメッセージをキューから受信する .NET Core コンソール アプリケーションを作成する。

注意

このクイックスタートでは、メッセージのバッチを Service Bus キューに送信し、それらを受信するという簡単なシナリオを実装するステップバイステップの手順を説明します。 .NET クライアント ライブラリの概要については、「Azure Service Bus client library for .NET」 (.NET 用 Azure Service Bus クライアント ライブラリ) を参照してください。 その他のサンプルについては、GitHub の Service Bus .NET サンプルを参照してください。

前提条件

このサービスを初めて使用する場合は、このクイックスタートを実行する前に、[Service Bus の概要](service-bus-messaging-overview.md)に関する記事を参照してください。

  • Azure サブスクリプション。 Azure Service Bus など、Azure の各種サービスを使用するには、サブスクリプションが必要です。 Azure アカウントを持っていない場合、無料試用版でサインアップできます。
  • Microsoft Visual Studio 2019。 Azure Service Bus クライアント ライブラリでは、C# 8.0 で導入された新機能を使用します。 以前のバージョンの C# 言語でもライブラリを使用できますが、新しい構文は利用できません。 完全な構文を使用するには、.NET Core SDK 3.0 以上で、言語バージョンを latest に設定してコンパイルすることをお勧めします。 Visual Studio を使用している場合、Visual Studio 2019 より前のバージョンには、C# 8.0 プロジェクトをビルドするために必要なツールとの互換性がありません。

Azure Portal での名前空間の作成

Azure の Service Bus メッセージング エンティティを使用するには、Azure 全体で一意となる名前を備えた名前空間を最初に作成しておく必要があります。 名前空間は、アプリケーション内で Service Bus リソースのためのスコープ コンテナーを提供します。

名前空間を作成するには:

  1. Azure ポータル

  2. ポータルの左側のナビゲーション ウィンドウで、 [+ リソースの作成][統合][Service Bus] の順に選択します。

    Image showing selection of Create a resource, Integration, and then Service Bus in the menu.

  3. [名前空間の作成] ページの [基本] タブで、こちらの手順を実行します。

    1. [サブスクリプション] で、名前空間を作成する Azure サブスクリプションを選択します。

    2. [リソース グループ] で、名前空間を追加する既存のリソース グループを選択するか、新しいリソース グループを作成します。

    3. 名前空間の名前を入力します。 名前空間名は次の名前付け規則に従う必要があります。

      • この名前は Azure 全体で一意である必要があります。 その名前が使用できるかどうかがすぐに自動で確認されます。
      • 名前の長さは 6 ~ 50 文字である。
      • この名前には、文字、数字、ハイフン "-" のみを含めることができます。
      • 名前の先頭は文字、末尾は文字または数字にする必要があります。
      • 名前の末尾は “-sb“ または “-mgmt“ にはできません。
    4. [場所] で、名前空間をホストするリージョンを選択します。

    5. [価格レベル] で、名前空間の価格レベル (Basic、Standard、Premium) を選択します。 このクイック スタートでは、 [Standard] を選択します。

      重要

      トピックとサブスクリプションを使用する場合は、Standard または Premium を選択してください。 Basic 価格レベルでは、トピックとサブスクリプションはサポートされていません。

      [Premium] 価格レベルを選択した場合は、メッセージング ユニットの数を指定します。 Premium レベルでは、各ワークロードが分離した状態で実行されるように、CPU とメモリのレベルでリソースが分離されます。 このリソースのコンテナーをメッセージング ユニットと呼びます。 Premium 名前空間には、少なくとも 1 つのメッセージング ユニットがあります。 Service Bus の Premium 名前空間ごとに、1 個、2 個、4 個、8 個、または 16 個のメッセージング ユニットを選択できます。 詳細については、Service Bus の Premium メッセージングに関するページをご覧ください。

    6. [Review + create](レビュー + 作成) を選択します。 これで、システムによってサービス名前空間が作成され、有効になります。 システムがアカウントのリソースを準備し 終わるまでに、数分間かかる場合があります。

      Image showing the Create a namespace page

    7. [作成] ページで、設定を確認し、[作成] を選択します。

  4. デプロイ ページで [リソースに移動] を選択します。

    Image showing the deployment succeeded page with the Go to resource link.

  5. Service Bus 名前空間のホーム ページが表示されます。

    Image showing the home page of the Service Bus namespace created.

接続文字列を取得する

新しい名前空間を作成すると、主キーとセカンダリ キー、およびそれぞれが名前空間のすべての側面を完全に制御できるプライマリとセカンダリの接続文字列を使用して、Shared Access Signature (SAS) の初期ポリシーが自動的に生成されます。 通常の送信者と受信者を対象に、より権限を制限した規則を作成する方法については、「Service Bus の認証と承認」をご覧ください。

名前空間のプライマリ接続文字列をコピーするには、次の手順に従います。

  1. [Service Bus 名前空間] ページで、左側のメニューの [共有アクセス ポリシー] を選択します。

  2. [共有アクセス ポリシー] ページで、 [RootManageSharedAccessKey] を選択します。

  3. [ポリシー: RootManageSharedAccessKey] ウィンドウで、[プライマリ接続文字列] の横にある [コピー] ボタンを選択し、後で使用するために接続文字列をクリップボードにコピーします。 この値をメモ帳などに一時的に貼り付けます。

    Screenshot shows an S A S policy called RootManageSharedAccessKey, which includes keys and connection strings.

    このページを使用して、主キー、2 次キー、プライマリ接続文字列、セカンダリ接続文字列をコピーできます。

Azure portal でキューを作成する

  1. [Service Bus 名前空間] ページで、左側のナビゲーション メニューの [キュー] を選択します。

  2. [キュー] ページで、ツール バーの [+ キュー] を選択します。

  3. キューの名前を入力し、他の値は既定値のままにします。

  4. ここで、 [作成] を選択します。

    Image showing creation of a queue in the portal

キューへのメッセージの送信

このセクションでは、Service Bus キューにメッセージを送信する .NET Core コンソール アプリケーションを作成する方法を説明します。

注意

このクイックスタートでは、メッセージのバッチを Service Bus キューに送信し、それらを受信するという簡単なシナリオを実装するステップバイステップの手順を説明します。 その他のシナリオや高度なシナリオのサンプルについては、GitHub の Service Bus .NET サンプルを参照してください。

コンソール アプリケーションの作成

  1. Visual Studio 2019 を起動します。

  2. [新しいプロジェクトの作成] を選択します。

  3. **[新しいプロジェクトの作成]** ダイアログ ボックスで、次の手順に従います。このダイアログ ボックスが表示されない場合は、メニューで **[ファイル]****[新規]****[プロジェクト]** の順に選択します。

    1. プログラミング言語として **[C#]** を選択します。

    2. アプリケーションの種類として [コンソール] を選択します。

    3. 結果リストから **[コンソール アプリケーション]** を選択します。

    4. 次に、 [次へ] を選択します。

      Image showing the Create a new project dialog box with C# and Console selected

  4. プロジェクト名に「QueueSender」、ソリューション名に「ServiceBusQueueQuickStart」と入力し、 [次へ] を選択します。

    Image showing the solution and project names in the Configure your new project dialog box

  5. [追加情報] ページで、 [作成] を選択してソリューションとプロジェクトを作成します。

Service Bus NuGet パッケージの追加

  1. メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  2. 次のコマンドを実行して、Azure.Messaging.ServiceBus NuGet パッケージをインストールします。

    Install-Package Azure.Messaging.ServiceBus
    

キューにメッセージを送信するコードを追加する

  1. Program.cs 内の名前空間定義の先頭 (クラス宣言の前) に、次の using ステートメントを追加します。

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
  2. Program クラス内で、Main メソッドの直前に次のプロパティを宣言します。

    <NAMESPACE CONNECTION STRING> を Service Bus 名前空間のプライマリ接続文字列に置き換えます。 また、<QUEUE NAME> を実際のキューの名前に置き換えます。

    
    // connection string to your Service Bus namespace
    static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
    // name of your Service Bus queue
    static string queueName = "<QUEUE NAME>";
    
    // the client that owns the connection and can be used to create senders and receivers
    static ServiceBusClient client;
    
    // the sender used to publish messages to the queue
    static ServiceBusSender sender;
    
    // number of messages to be sent to the queue
    private const int numOfMessages = 3;
    
    
  3. Main メソッドのコードを次のコードに置き換えます。 コードの詳細については、コードのコメントを参照してください。 コードの重要な手順を次に示します。

    1. 名前空間へのプライマリ接続文字列を使用して ServiceBusClient オブジェクトを作成します。

    2. ServiceBusClient オブジェクトの CreateSender メソッドを呼び出して、特定の Service Bus キュー用の ServiceBusSender オブジェクトを作成します。

    3. ServiceBusSender.CreateMessageBatchAsync メソッドを使用して ServiceBusMessageBatch オブジェクトを作成します。

    4. ServiceBusMessageBatch.TryAddMessage を使用して、メッセージをバッチに追加します。

    5. ServiceBusSender.SendMessagesAsync メソッドを使用してメッセージのバッチを Service Bus キューに送信します。

      static async Task Main()
      {
          // The Service Bus client types are safe to cache and use as a singleton for the lifetime
          // of the application, which is best practice when messages are being published or read
          // regularly.
          //
          // Create the clients that we'll use for sending and processing messages.
          client = new ServiceBusClient(connectionString);
          sender = client.CreateSender(queueName);
      
          // create a batch 
          using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
      
          for (int i = 1; i <= numOfMessages; i++)
          {
              // try adding a message to the batch
              if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
              {
                  // if it is too large for the batch
                  throw new Exception($"The message {i} is too large to fit in the batch.");
              }
          }
      
          try
          {
              // Use the producer client to send the batch of messages to the Service Bus queue
              await sender.SendMessagesAsync(messageBatch);
              Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue.");
          }
          finally
          {
              // Calling DisposeAsync on client types is required to ensure that network
              // resources and other unmanaged objects are properly cleaned up.
              await sender.DisposeAsync();
              await client.DisposeAsync();
          }
      
          Console.WriteLine("Press any key to end the application");
          Console.ReadKey();
      }    
      
  4. Program.cs ファイルは次のようになります。

    using System;
    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
    namespace QueueSender
    {
        class Program
        {
            // connection string to your Service Bus namespace
            static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
            // name of your Service Bus queue
            static string queueName = "<QUEUE NAME>";
    
            // the client that owns the connection and can be used to create senders and receivers
            static ServiceBusClient client;
    
            // the sender used to publish messages to the queue
            static ServiceBusSender sender;
    
            // number of messages to be sent to the queue
            private const int numOfMessages = 3;
    
            static async Task Main()
            {
                // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                // of the application, which is best practice when messages are being published or read
                // regularly.
                //
                // Create the clients that we'll use for sending and processing messages.
                client = new ServiceBusClient(connectionString);
                sender = client.CreateSender(queueName);
    
                // create a batch 
                using ServiceBusMessageBatch messageBatch = await sender.CreateMessageBatchAsync();
    
                for (int i = 1; i <= numOfMessages; i++)
                {
                    // try adding a message to the batch
                    if (!messageBatch.TryAddMessage(new ServiceBusMessage($"Message {i}")))
                    {
                        // if it is too large for the batch
                        throw new Exception($"The message {i} is too large to fit in the batch.");
                    }
                }
    
                try
                {
                    // Use the producer client to send the batch of messages to the Service Bus queue
                    await sender.SendMessagesAsync(messageBatch);
                    Console.WriteLine($"A batch of {numOfMessages} messages has been published to the queue.");
                }
                finally
                {
                    // Calling DisposeAsync on client types is required to ensure that network
                    // resources and other unmanaged objects are properly cleaned up.
                    await sender.DisposeAsync();
                    await client.DisposeAsync();
                }
    
                Console.WriteLine("Press any key to end the application");
                Console.ReadKey();
            }
        }
    }   
    
  5. <NAMESPACE CONNECTION STRING> を Service Bus 名前空間のプライマリ接続文字列に置き換えます。 また、<QUEUE NAME> を実際のキューの名前に置き換えます。

  6. プロジェクトをビルドし、エラーがないことを確認します。

  7. プログラムを実行し、確認メッセージが表示されるまで待ちます。

    A batch of 3 messages has been published to the queue
    
  8. Azure portal で次の手順を実行します。

    1. 自分の Service Bus 名前空間に移動します。

    2. [概要] ページ中央下のペインでキューを選択します。

      Image showing the Service Bus Namespace page in the Azure portal with the queue selected.

    3. [要点] セクションの値に注目します。

    Image showing the number of messages received and the size of the queue

    次の値に注目してください。

    • キューの [アクティブ] メッセージ数の値は、現在 3 です。 メッセージを取得せずにこの送信側アプリを実行するたびに、この値が 3 ずつ増えます。
    • アプリからキューにメッセージを追加するたびに、キューの [現在のサイズ] が増加します。
    • 下部の [メトリック] セクションの [メッセージ] グラフでは、キューに 3 つの受信メッセージがあることがわかります。

キューからメッセージを受け取る

このセクションでは、キューからメッセージを受信する .NET Core コンソール アプリケーションを作成します。

注意

このクイックスタートでは、メッセージのバッチを Service Bus キューに送信し、それらを受信するという簡単なシナリオを実装するステップバイステップの手順を説明します。 その他のシナリオや高度なシナリオのサンプルについては、GitHub の Service Bus .NET サンプルを参照してください。

受信側のプロジェクトを作成する

  1. ソリューション エクスプローラー ウィンドウで、 [ServiceBusQueueQuickStart] ソリューションを右クリックし、 [追加] をポイントして、 [新しいプロジェクト] を選択します。
  2. [コンソール アプリケーション] を選択し、 [次へ] を選択します。
  3. [プロジェクト名] に「QueueReceiver」と入力し、 [作成] を選択します。
  4. ソリューション エクスプローラー ウィンドウで、 [QueueReceiver] を右クリックし、 [Set as a Startup Project](スタートアップ プロジェクトとして設定) を選択します。

Service Bus NuGet パッケージの追加

  1. メニューから [ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] の順に選択します。

  2. [パッケージ マネージャー コンソール] ウィンドウで、 [既定のプロジェクト]QueueReceiver が選択されていることを確認します。 選択されていない場合は、ドロップダウン リストを使用して QueueReceiver を選択します。

    Screenshot showing QueueReceiver project selected in the Package Manager Console

  3. 次のコマンドを実行して、Azure.Messaging.ServiceBus NuGet パッケージをインストールします。

    Install-Package Azure.Messaging.ServiceBus
    

キューからメッセージを受信するコードを追加する

このセクションでは、キューからメッセージを取得するコードを追加します。

  1. Program.cs 内の名前空間定義の先頭 (クラス宣言の前) に、次の using ステートメントを追加します。

    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
  2. Program クラス内で、Main メソッドの直前に次のプロパティを宣言します。

    <NAMESPACE CONNECTION STRING> を Service Bus 名前空間のプライマリ接続文字列に置き換えます。 また、<QUEUE NAME> を実際のキューの名前に置き換えます。

    // connection string to your Service Bus namespace
    static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
    // name of your Service Bus queue
    static string queueName = "<QUEUE NAME>";
    
    // the client that owns the connection and can be used to create senders and receivers
    static ServiceBusClient client;
    
    // the processor that reads and processes messages from the queue
    static ServiceBusProcessor processor;
    
  3. 受信したメッセージや発生したエラーを処理するために、次のメソッドを Program クラスに追加します。

    // handle received messages
    static async Task MessageHandler(ProcessMessageEventArgs args)
    {
        string body = args.Message.Body.ToString();
        Console.WriteLine($"Received: {body}");
    
        // complete the message. message is deleted from the queue. 
        await args.CompleteMessageAsync(args.Message);
    }
    
    // handle any errors when receiving messages
    static Task ErrorHandler(ProcessErrorEventArgs args)
    {
        Console.WriteLine(args.Exception.ToString());
        return Task.CompletedTask;
    }
    
  4. Main メソッドのコードを次のコードに置き換えます。 コードの詳細については、コードのコメントを参照してください。 コードの重要な手順を次に示します。

    1. 名前空間へのプライマリ接続文字列を使用して ServiceBusClient オブジェクトを作成します。

    2. ServiceBusClient オブジェクトの CreateProcessor メソッドを呼び出し、指定した Service Bus キュー用の ServiceBusProcessor オブジェクトを作成します。

    3. ServiceBusProcessor オブジェクトの ProcessMessageAsync および ProcessErrorAsync の各イベントのハンドラーを指定します。

    4. ServiceBusProcessor オブジェクトの StartProcessingAsync を呼び出して、メッセージの処理を開始します。

    5. ユーザーが任意のキーを押して処理を終了すると、ServiceBusProcessor オブジェクトの StopProcessingAsync が呼び出されます。

      詳細については、コードのコメントを参照してください。

              static async Task Main()
              {
                  // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                  // of the application, which is best practice when messages are being published or read
                  // regularly.
                  //
      
                  // Create the client object that will be used to create sender and receiver objects
                  client = new ServiceBusClient(connectionString);
      
                  // create a processor that we can use to process the messages
                  processor = client.CreateProcessor(queueName, new ServiceBusProcessorOptions());
      
                  try
                  {
                      // add handler to process messages
                      processor.ProcessMessageAsync += MessageHandler;
      
                      // add handler to process any errors
                      processor.ProcessErrorAsync += ErrorHandler;
      
                      // start processing 
                      await processor.StartProcessingAsync();
      
                      Console.WriteLine("Wait for a minute and then press any key to end the processing");
                      Console.ReadKey();
      
                      // stop processing 
                      Console.WriteLine("\nStopping the receiver...");
                      await processor.StopProcessingAsync();
                      Console.WriteLine("Stopped receiving messages");
                  }
                  finally
                  {
                      // Calling DisposeAsync on client types is required to ensure that network
                      // resources and other unmanaged objects are properly cleaned up.
                      await processor.DisposeAsync();
                      await client.DisposeAsync();
                  }
              }
      
  5. Program.cs は次のようになります。

    using System;
    using System.Threading.Tasks;
    using Azure.Messaging.ServiceBus;
    
    namespace QueueReceiver
    {
        class Program
        {
            // connection string to your Service Bus namespace
            static string connectionString = "<NAMESPACE CONNECTION STRING>";
    
            // name of your Service Bus queue
            static string queueName = "<QUEUE NAME>";
    
    
            // the client that owns the connection and can be used to create senders and receivers
            static ServiceBusClient client;
    
            // the processor that reads and processes messages from the queue
            static ServiceBusProcessor processor;
    
            // handle received messages
            static async Task MessageHandler(ProcessMessageEventArgs args)
            {
                string body = args.Message.Body.ToString();
                Console.WriteLine($"Received: {body}");
    
                // complete the message. messages is deleted from the queue. 
                await args.CompleteMessageAsync(args.Message);
            }
    
            // handle any errors when receiving messages
            static Task ErrorHandler(ProcessErrorEventArgs args)
            {
                Console.WriteLine(args.Exception.ToString());
                return Task.CompletedTask;
            }
    
            static async Task Main()
            {
                // The Service Bus client types are safe to cache and use as a singleton for the lifetime
                // of the application, which is best practice when messages are being published or read
                // regularly.
                //
    
                // Create the client object that will be used to create sender and receiver objects
                client = new ServiceBusClient(connectionString);
    
                // create a processor that we can use to process the messages
                processor = client.CreateProcessor(queueName, new ServiceBusProcessorOptions());
    
                try
                {
                    // add handler to process messages
                    processor.ProcessMessageAsync += MessageHandler;
    
                    // add handler to process any errors
                    processor.ProcessErrorAsync += ErrorHandler;
    
                    // start processing 
                    await processor.StartProcessingAsync();
    
                    Console.WriteLine("Wait for a minute and then press any key to end the processing");
                    Console.ReadKey();
    
                    // stop processing 
                    Console.WriteLine("\nStopping the receiver...");
                    await processor.StopProcessingAsync();
                    Console.WriteLine("Stopped receiving messages");
                }
                finally
                {
                    // Calling DisposeAsync on client types is required to ensure that network
                    // resources and other unmanaged objects are properly cleaned up.
                    await processor.DisposeAsync();
                    await client.DisposeAsync();
                }
            }
        }
    }
    
  6. <NAMESPACE CONNECTION STRING> を Service Bus 名前空間のプライマリ接続文字列に置き換えます。 また、<QUEUE NAME> を実際のキューの名前に置き換えます。

  7. プロジェクトをビルドし、エラーがないことを確認します。

  8. 受信側アプリを実行します。 受信メッセージが表示されます。 任意のキーを押して、受信側とアプリケーションを停止します。

    Wait for a minute and then press any key to end the processing
    Received: Message 1
    Received: Message 2
    Received: Message 3
    
    Stopping the receiver...
    Stopped receiving messages
    
  9. もう一度ポータルを確認します。 [アクティブ] メッセージ数に 0 と表示されていない場合は、数分待ってからページを最新の情報に更新します。

    • [アクティブ] メッセージ数と [現在のサイズ] の値が 0 になりました。

    • 下部の [メトリック] セクションの [メッセージ] グラフを見ると、このキューには 3 つの受信メッセージと 3 つの送信メッセージがあることがわかります。

      Active messages and size after receive

次の手順

次のドキュメントおよびサンプルを参照してください。