はじめに
本記事は、『Java on Azure 実践開発 Blob Upload』シリーズの第3回「定期アップロード」編です。
サンプルコードは、kohei3110/JavaOnAzure-BlobStorage に上がっています。
シナリオ概説
本シリーズでは、Blob Storage へのファイルアップロードについて、Azure を使った Java アプリケーションのサンプルコードを使用しながら、開発方法をご紹介します。
一口にファイルアップロードといっても、あらゆる方式があるかと思います。例えば、以下のようなものがあります。
| No. | シナリオ | 概要 | 記事 URL |
|---|---|---|---|
| 1 | サーバー経由でのストリームライクなアップロード | SAS の流出を懸念する場合、サーバー経由でのストリームライクなアップロード | Java on Azure 実践開発【Blob Upload ①: ストリームライクなアップロード編】 |
| 2 | サーバーに一時保存後アップロード | アプリケーションサーバーのローカルストレージにファイルを一度保存後、アップロード(クライアントからは同期に見える) | Java on Azure 実践開発【Blob Upload ②: App Service ローカル保存後アップロード編】 |
| 3 | サーバーに一時保存後定期アップロード | アプリケーションサーバーのローカルストレージにファイルを一度保存後、定期ジョブにてアップロード(クライアントからは非同期に見える) | Java on Azure 実践開発【Blob Upload ③: 定期アップロード編】 |
| 4 | 署名付き URL を使ったアップロード | アプリケーションから返却された署名付き URL を用いて、クライアントからファイルをアップロードする | Java on Azure 実践開発【Blob Upload ④: 署名付き URL を使ったアップロード編】 |
本記事では、『3. 定期アップロード』について実装上のポイントを解説していきます。
実装内容
クライアントからリクエストされたアップロード対象のファイルを、App Service のローカルファイルシステムに一時保存します。保存が完了したら、クライアントに OK(200) を返却します。
App Service が実行されている App Service Plan の上で、最終更新日時が1分以内のファイルをアップロードする定期ジョブが別インスタンスとして実行されます。このジョブを、今回は Web Jobs にて実装しています。
この Web Jobs は、1 時間に 1 回、アップロード対象のファイルを削除するジョブも実行します。これにより、アップロードされたファイルが App Service Plan のファイルシステムから削除されます。
実装に必要なクラス
ここからは、実装する際に必要となるクラスについて解説していきます。
BlobAsyncClient クラス
BlobAsyncClient クラスは、Blob Storage の各オブジェクト(Blob)操作をするためのクライアントを提供します。BlobAsyncClient クラスにより、Blob アップロードやダウンロード、Blob のコピーなどの操作が可能になります。
BlobAsyncClient は、BlobClientBuilder でインスタンス化するか、getBlobAsyncClient()メソッドで取得することができます。
なお、Azure では以下3種類の Blob をサポートしています。今回は、ファイルアップロード用途なので、ブロック Blob を使用しました。
これらに対応するクライアントも、Azure SDK for Java で用意されています。
| Blob 種類 | 概要 | クライアント取得メソッド | Javadoc |
|---|---|---|---|
| ブロック BLOB | 大量のデータを効率的にアップロードするためのに最適。 | BlobAsyncClient.getBlockBlobAsyncClient Method | getBlockBlobAsyncClient() |
| 追加 BLOB | 追加操作(仮想マシンのデータのログ記録などのシナリオ)に最適。 | BlobAsyncClient.getAppendBlobAsyncClient Method | getAppendBlobAsyncClient() |
| ページ BLOB | ランダムな読み取りと書き込みの操作用に最適。 | BlobAsyncClient.getPageBlobAsyncClient Method | getPageBlobAsyncClient() |
参考: 『BlobAsyncClient Class』
JavaDoc: 『Class BlobAsyncClient』
・・・
BlobAsyncClient blobAsyncClient = new BlobClientBuilder()
.connectionString(connectionString)
.containerName(CONTAINER_NAME)
.blobName(blobName)
.buildAsyncClient();
・・・
Tips
実装上の Tips をご紹介します。
Web Jobs のアップロード方法
Azure WebJobsとは、Azureにて、crontabで定義するような定期処理または、デーモンプロセスのようなものを起動するための仕組みです。
デプロイには、以下の作業が必要です。
1)コンパイルし、jar ファイルにパッケージング
2)実行用のバッチファイル(run.cmdを作成)
set PATH=%PATH%;%JAVA_HOME%/bin
java -jar webjob-0.0.1-SNAPSHOT.jar
今回は、jar ファイルとバッチファイルの2つをzip化し、Azure Portal から WebJobs のデプロイを行いました。
App Service Plan でのインスタンスを跨いだストレージの参照
今回は、一つの App Service Plan に複数の App Service インスタンス(App Service / WebJobs)をデプロイしています。
App Service インスタンス間で共有ドライブを参照し、そのドライブに存在するファイルを操作するため、%HOME% 配下をマウントする構成としています。
App Service Plan のファイルシステムの構成は、以下サイトが詳しいです。
GitHub: Understanding the Azure App Service file system
おわりに
本記事は、『Java on Azure 実践開発 Blob Upload 編】③』として、アプリケーション実行環境のローカルストレージに保存後、定期ジョブにてファイルをアップロードする方法についてまとめました。
次回は、アプリケーションから返却された期限付き URL を用いて、クライアントからファイルをアップロードする方法についてまとめていきます!お楽しみに~。


