目次
検証環境
- Azure Functions v3
- Azure.Storage.Queues v12.6.0
実装
NuGet でライブラリをインストールする。
using Azure.Storage.Queues; using Azure.Storage.Queues.Models;
キューの作成
var connectionString = "ConnectionString"; var queueName = "QueueName”; var queueClient = new QueueClient(connectionString, queueName); await queueClient.CreateAsync();
メッセージの追加
await queueClient.SendMessageAsync("First"); await queueClient.SendMessageAsync("Second"); // 最近はBinaryも追加できるらしい var binary = new BinaryData(new byte[0]); await queueClient.SendMessageAsync(binary);
メッセージの表示
Azure.Response
でラップされてるので Value
プロパティを参照する。
var message = await queueClient.PeekMessageAsync(); log.LogInformation(message.Value.MessageId + ":" + message.Value.MessageText); var messages = await queueClient.PeekMessagesAsync(maxMessages:5); foreach (var msg in messages.Value) { log.LogInformation(msg.MessageId + ":" + msg.MessageText); }
メッセージの更新
キューは積み直しになる。
ReceiveMessageAsync
ではなく SendMessageAsync
の戻り値を使って更新しても同じ。
var receipt = await queueClient.ReceiveMessageAsync();
await queueClient.UpdateMessageAsync(receipt.Value.MessageId, receipt.Value.PopReceipt, "Updated");
メッセージの受信
受信するとキューからは削除される。
Azure.Response
でラップされてるので Value
プロパティを参照する。
var message = await queueClient.ReceiveMessageAsync();
log.LogInformation(message.Value.MessageId + ":" + message.Value.MessageText);
複数件受信する場合。
var messages = await queueClient.ReceiveMessagesAsync(maxMessages: 5); foreach (var msg in messages.Value) { log.LogInformation(msg.MessageId + ":" + msg.MessageText); }
メッセージの削除
ReceiveMessageAsync
で消えてしまうので、PeekedMessage
で PopReceipt
が取れないので使いみちあるのか謎。
SendMessageAsync
時に取り消すくらいには使えるかもしれない。
var message = await queueClient.ReceiveMessageAsync(); await queueClient.DeleteMessageAsync(message.Value.MessageId, message.Value.PopReceipt);
キューの削除
// キューが存在しない場合は例外発生 await queueClient.DeleteAsync(); // キューが存在しない場合に例外が出ない await queueClient.DeleteIfExistsAsync();
その他
メッセージのエンコード
Azure Functions のキュートリガーが文字列を受け取る場合、Base64 でエンコードされた値が想定されている。エンコードされていない値だと例外が発生する。 そのためキューに追加する時に、Base64 でエンコードした文字列を設定する必要がある。
SDK を使って文字列を追加する場合、SDK の v12 と v11 以前では動作が異なるので注意が必要。 v11 以前では自動的にエンコードされていたが、v12 ではエンコードされなくなったため明示的にエンコードする。
関連記事
- Azure Functions で Azure Cosmos DB (Table) を操作する
- Azure Functions で Azure Table Storage を操作する
- Azure Functions で Azure Blob Storage にファイルを保存する
- Azure Functions で Azure Blob Storage からファイルを取得する
- Azure Functions で Azure Storage への接続情報
- Azure Functions で Azure Key Valut から設定を読み込む
- Azure Functions で Startup クラスを定義して DI を利用する
- Azure Managed ID を利用する