yotiky Tech Blog

とあるエンジニアの備忘録

Azure Functions で Azure Queue Storage を操作する

目次

検証環境

  • 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 で消えてしまうので、PeekedMessagePopReceipt が取れないので使いみちあるのか謎。 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 ではエンコードされなくなったため明示的にエンコードする。

関連記事