.NET CoreでAzure Queueを試したサンプルコード

.NET Core 2.0のコンソールアプリでAzureのQueueを使ってみました。

上記ドキュメントを参考にして

  • キューの作成と削除
  • メッセージの追加、取得、削除

を試しています。

準備

コンソール アプリ (.NET Core)プロジェクトを作成して、NuGetでWindowsAzure.Storageをインストールします。

Install-Package WindowsAzure.Storage

NuGet Gallery | WindowsAzure.Storage 9.1.0

Queueサンプルを実行するエントリ(Program.cs)

接続文字列からストレージアカウントを作成してQueueサンプルを実行します。

Queueを試す(QueueSample.cs)

QueueSampleクラスです。

CloudQueueClientを使ってQueueを作成・削除できます。あとはQueueにメッセージを追加したり、Queueからメッセージを取得したり、削除したり。

なるほどねと思ったのは、CloudQueue.GetMessageAsyncメソッドやCloudQueue.GetMessagesAsyncメソッドで取得したメッセージが一時的に参照できなくなることです。同じメッセージを二重で処理しないようにするためですね。

.NET CoreでAzure Blobを試したサンプルコード

.NET Core 2.0のコンソールアプリでAzureのBlobを試しました。

このあたりのドキュメントを参考にしながら書いてみたサンプルコードを残しておきます。

ミニマムかなと思う次のことを試しましたが、ほとんど躓かずにできたかなと思います。ドキュメントがわかりやすくてありがたいです。

  • Blobコンテナの作成と削除
  • Blobの追加、更新、削除
  • Blobの取得
  • Blob一覧の取得

準備

コンソール アプリ (.NET Core)プロジェクトを作成して、NuGetでWindowsAzure.Storageをインストールします。

Install-Package WindowsAzure.Storage

NuGet Gallery | WindowsAzure.Storage 9.1.0

Blobサンプルを実行するエントリ(Program.cs)

接続文字列からストレージアカウントを作成してBlobサンプルを実行しています。

Blobを試す(BlobSample.cs)

実際のBlobサンプル部分です。

流れとしてはまずストレージアカウントからBlobクライアントを作成して、次にBlobクライアントからBlobコンテナを取得(作成)します。そして、Blobコンテナが持っているBlobを操作するメソッドを使ってごにょごにょする感じです。

Blobの追加もBlobの更新も要するにアップロードなので、どちらの場合もCloudBlockBlob.UploadTextAsyncメソッドやCloudBlockBlob.UploadFromStreamAsyncメソッドなどを使うみたいです。

// 追加も更新も同じ
var blob = container.GetBlockBlobReference("Blobの名前");
await blob.UploadTextAsync("Blobの中身");

Blobの一覧を取得するにはCloudBlobContainer.ListBlobsSegmentedAsyncメソッドを使いますが、デフォルトの動きでは1回に取得できるのは5,000個までとのことです。それ以上の場合は、BlobContinuationTokenを使って取得を繰り返すようにするみたいです。

この部分。

var token = default(BlobContinuationToken);
do {
    // Blobの一覧を取得
    var segment = await container.ListBlobsSegmentedAsync(token);

    token = segment.ContinuationToken;

    foreach (var blob in segment.Results.OfType<CloudBlockBlob>()) {
        // blobを使って何かする
    }
} while (token != null); // トークンがnullでないとまだ一覧取得できる

おわり。

Promiseオブジェクトのメソッド(all、race)を試す

前回の続きでPromiseオブジェクトのallとraceを試したコードです。

ichiroku11.hatenablog.jp

allとraceの動きを確認するためにまずは次の2つの関数を用意しました。

  • resolveAsync - 指定した時間後にresolveするPromiseを返す関数
  • rejectAsync - 指定した時間後にrejectするPromiseを返す関数

話は少しそれますが、ログで時間を確認するためにConsole.timeStampメソッドを使っています。私の環境では最初TS2339 (TS) プロパティ 'timeStamp' は型 'Console' に存在しません。といったエラーが出ていましたが、ConsoleのインターフェイスにtimeStampメソッドを定義してエラーを解消しました。

interface Console {
    timeStamp(label?: string): void;
}

Declaration Mergingという機能ですね。たぶん。

Declaration Merging · TypeScript

脱線終わり。

Promise.all

Promise.allメソッドは、引数のすべてのPromiseがresolveするとresolveするか、引数のPromiseのどれか1つでもrejectするとrejectするPromiseを返します。

Promise.all() - JavaScript | MDN

resolveする場合

Promise.allメソッド(とawait)は、引数のすべてのPromiseがresolveするまで待った後、引数のPromiseそれぞれの結果を配列として取得できます。以下では3秒待って、3つのPromiseの結果を取得しています。

rejectする場合

引数のPromiseのうちどれか1つがrejectするとすぐに例外がスローされます。以下は1秒後に"エラー2"がrejectしています。

Promise.race

Promise.raceメソッドは、引数のPromiseのどれか1つがresolveするとresolveするか、引数のPromiseのどれか1つがrejectするとrejectするPromiseを返します。

resolveする場合

引数のPromiseのうちどれか1つがresolveするとすぐにresolveしたPromiseの結果を返します。1秒後に"c"がresolveされています。

rejectする場合

引数のPromiseのうちどれか1つがrejectするとすぐに例外がスローされます。1秒後に"エラー2"がrejectしています。

おしまい。

Promiseオブジェクトのメソッド(resolve、reject)を試す

Promiseオブジェクトのスタティックなメソッドを使ったサンプルです。async/awaitを試してみたくなったということもあってコードを書いてみました。

Promise - JavaScript | MDN

Promiseオブジェクトのスタティックなメソッドは4つ。

  • Promise.resolve
  • Promise.reject
  • Promise.all
  • Promise.race

今回はそのうちresolve、rejectを確認しました。以下はTypeScriptのコードです。結果はEdgeで確認しています。

Promise.resolve

まずはresolveした(完了した、成功した)Promiseを返すresolveメソッドです。

引数に渡した値でresolveします。実行結果からもわかりますが、デバッグ実行するとawaitのタイミングで一度関数を抜けます。

Promise.reject

rejectメソッドはrejectした(失敗した)Promiseを返します。

引数に渡した値が例外としてスローされます。

残りのallとraceは次回で。

RxJS - doオペレータ

公式ドキュメントに「デバッグするときに便利だよ」と書いてあるdoオペレータを試しました。

This operator is useful for debugging your Observables for the correct values or performing other side effects.

こちらのドキュメントのdoオペレータの説明から引用してます。(ハッシュ付きのリンクを埋めてるのにジャンプしないけど気にしない・・・)

doオペレータを使ってトレース

doオペレータを使うと値がどのように流れているか確認できます。

次にコードでは、

  • 値"1"と"3"はfilterで止まっている
  • 値"2"はfilter、mapと処理されてsubscribeでnextコールバックが呼ばれている

といったことが読み取れると思います。

またdoオペレータの引数はsubscribeと同じでcompleteコールバックやerrorコールバックも指定できます。