キューを使用してメッセージを送受信するコードを記述する

完了

分散アプリケーションでは、送信先コンポーネントに配信されるのを待っているメッセージの一時的な保存場所として、Service Bus キューが使用されます。 キューを介してメッセージを送受信するには、送信元と送信先の両方のコンポーネントでコードを記述する必要があります。

Contoso Bicycles アプリケーションについて考えます。 顧客は Web サイトまたはモバイル アプリを使用して注文できます。 Web サイトとモバイル アプリは顧客のデバイス上で実行されるため、実際には、同時に行うことができる注文の数に制限はありません。 モバイル アプリと Web サイトで Service Bus キューに注文をためることで、バックエンド コンポーネント (Web アプリ) では独自のペースでそのキューからの注文を処理することができます。

Contoso Bicycles アプリケーションは実際には複数のステップで新しい注文を処理します。 そのすべてのステップが最初の支払いの承認に依存するので、キューを使用することに決めます。 受信コンポーネントの最初のジョブは、支払いの処理です。

Contoso は、モバイル アプリと Web サイトにおいて、キューにメッセージを追加するコードを記述する必要があります。 Contoso は、バックエンドの Web アプリに、キューからメッセージを取り出すコードを記述します。

ここでは、Service Bus キューを使用してメッセージを送受信するコードを記述するプロセスと考慮事項について見ていきます。

Azure.Messaging.ServiceBus NuGet パッケージ

Service Bus を通してメッセージを送受信するコードを簡単に記述できるように、Microsoft では .NET クラスのライブラリを提供しています。 これを任意の .NET 言語で使用して、Service Bus のキューまたはトピックとやりとりすることができます。 Azure.Messaging.ServiceBus NuGet パッケージを追加することで、アプリケーションにこのライブラリを組み込むことができます。

接続文字列とキー

Service Bus 名前空間内のキューに接続するには、送信元コンポーネントと送信先コンポーネントの両方に 2 つの情報が必要です。

  • Service Bus 名前空間の場所 ("エンドポイント" とも呼ばれます)。場所は、servicebus.windows.net ドメイン内の完全修飾ドメイン名で指定されます。 例: bicycleService.servicebus.windows.net
  • アクセス キー:Service Bus では、有効なアクセス キーを要求することによって、キューまたはトピックへのアクセスが制限されます。

どちらの情報も、接続文字列の形式で ServiceBusClient オブジェクトに提供されます。 名前空間に対する正しい接続文字列は、Azure portal から取得できます。

メソッドを非同期に呼び出す

Azure のキューは、送信側と受信側のコンポーネントから何千キロも離れた場所に存在する可能性があります。 物理的に近くても、接続が遅かったり、帯域幅の競合のために、コンポーネントがキューのメソッドを呼び出したときに遅延が発生することがあります。 このため、Service Bus クライアント ライブラリではキューとのやりとりに async メソッドを使用できるようになっています。 これらのメソッドを使用して、呼び出しが完了するのを待つ間にスレッドがブロックされるのを防ぎます。

たとえば、キューにメッセージを送信するときは、await キーワードを指定して SendMessageAsync メソッドを使用します。

キューにメッセージを送信するには

メッセージをキューに送信するには、次の手順のようにします。

すべての送信または受信コンポーネントで、Service Bus キューを呼び出すコード ファイルに次の using ステートメントを追加します。

using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

次に、新しい ServiceBusClient オブジェクトを作成し、それに、接続文字列とキューの名前を渡します。

// Create a ServiceBusClient object using the connection string to the namespace.
await using var client = new ServiceBusClient(connectionString);
    
// Create a ServiceBusSender object by invoking the CreateSender method on the ServiceBusClient object, and specifying the queue name. 
ServiceBusSender sender = client.CreateSender(queueName);

ServiceBusSender.SendMessageAsync() メソッドを呼び出して、ServiceBusMessage を渡すことにより、キューにメッセージを送信できます。

// Create a new message to send to the queue.
string messageContent = "Order new crankshaft for eBike.";
var message = new ServiceBusMessage(messageContent);

// Send the message to the queue.
await sender.SendMessageAsync(message);

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

メッセージを受信するには、最初にメッセージ ハンドラーを登録する必要があります。 メッセージ ハンドラーはコード内のメソッドであり、メッセージがキューで利用可能になると呼び出されます。

// Create a ServiceBusProcessor for the queue.
await using ServiceBusProcessor processor = client.CreateProcessor(queueName, options);
    
// Specify handler methods for messages and errors.
processor.ProcessMessageAsync += MessageHandler;
processor.ProcessErrorAsync += ErrorHandler;

処理中の作業を行います。 その後、メッセージ ハンドラー内で ProcessMessageEventArgs.CompleteMessageAsync() メソッドを呼び出して、キューからメッセージを削除します。

await args.CompleteMessageAsync(args.Message);