はじめに
本記事は、『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 を用いて、クライアントからファイルをアップロードする方法についてまとめていきます!お楽しみに~。