以下の記事で、Spring BatchのChunkモデルを利用したバッチで、DBのデータをAzure Blob StorageにCSVファイルを出力する処理を、中間ファイルを利用せずに出力していた。
Spring BatchのChunkモデルを利用したバッチで中間ファイルを作らずCSVファイルを出力してみた以下の記事で、Spring BatchのChunkモデルを利用したバッチで、DBのデータをAzure Blob StorageにCSVフ...
今回は、同様の処理を、Azure Blob Storageにアクセスする箇所で、CloudBlobContainerクラスでなくBlobContainerClientクラスを利用してCSVファイルを出力してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事のサンプルプログラムを作成済であること。
Spring BatchのChunkモデルを利用したバッチで中間ファイルを作らずCSVファイルを出力してみた以下の記事で、Spring BatchのChunkモデルを利用したバッチで、DBのデータをAzure Blob StorageにCSVフ...
サンプルプログラムの作成
作成したサンプルプログラムの構成は、以下の通り。
なお、上記の赤枠は、今回変更したプログラムである。
Blob Storageにアクセスするクラスの内容は以下の通りで、Blob Storageへのファイルを書き込みや削除を、BlobContainerClientクラスを利用して行っている。
package com.example.service; import java.io.ByteArrayInputStream; import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.azure.storage.blob.BlobContainerClient; import com.azure.storage.blob.BlobServiceClient; import com.azure.storage.blob.BlobServiceClientBuilder; import com.azure.storage.blob.specialized.AppendBlobClient; import com.azure.storage.blob.specialized.BlockBlobClient; import io.netty.util.internal.StringUtil; @Service public class DemoBlobService { /** Azure Storageのアカウント名 */ @Value("${azure.storage.accountName}") private String storageAccountName; /** Azure Storageへのアクセスキー */ @Value("${azure.storage.accessKey}") private String storageAccessKey; /** Azure StorageのBlobコンテナー名 */ @Value("${azure.storage.containerName}") private String storageContainerName; /** 文字コード */ @Value("${character.code}") private String characterCode; // Blobストレージへの接続文字列 private String storageConnectionString = null; /** * Blobストレージへの接続文字列の初期化処理 */ @PostConstruct public void init() { // Blobストレージへの接続文字列を設定 storageConnectionString = "DefaultEndpointsProtocol=https;" + "AccountName=" + storageAccountName + ";" + "AccountKey=" + storageAccessKey + ";"; } /** * 引数で指定されたファイル(BlockBlob)に、引数で指定されたメッセージを書き込む. * @param fileName ファイル名(BlockBlob) * @param message メッセージ */ public void writeBlockBlob(String fileName, String message) { // 未指定の項目がある場合、何もしない if(StringUtil.isNullOrEmpty(storageAccountName) || StringUtil.isNullOrEmpty(storageAccessKey) || StringUtil.isNullOrEmpty(storageContainerName) || StringUtil.isNullOrEmpty(fileName) || StringUtil.isNullOrEmpty(message)) { return; } // ファイルアップロード処理 // Blob内のコンテナー内の指定したファイル(BlockBlob)に、指定したメッセージを書き込む try { BlockBlobClient blockBlobClient = getBlobContainerClient() .getBlobClient(fileName).getBlockBlobClient(); byte[] data = message.getBytes(characterCode); blockBlobClient.upload(new ByteArrayInputStream(data), data.length); } catch (Exception ex) { throw new RuntimeException(ex); } } /** * 引数で指定されたBlob(BlockBlob)が存在する場合、削除する. * @param blobName Blob名(BlockBlob) */ public void deleteBlockBlob(String fileName) { // 未指定の項目がある場合、何もしない if(StringUtil.isNullOrEmpty(storageAccountName) || StringUtil.isNullOrEmpty(storageAccessKey) || StringUtil.isNullOrEmpty(storageContainerName) || StringUtil.isNullOrEmpty(fileName)) { return; } // Blob内のコンテナー内の指定したファイル(BlockBlob)が存在する場合、削除する try { BlockBlobClient blockBlobClient = getBlobContainerClient() .getBlobClient(fileName).getBlockBlobClient(); if(blockBlobClient.exists()) { blockBlobClient.delete(); } } catch (Exception ex) { throw new RuntimeException(ex); } } /** * 引数で指定されたファイル(追加Blob)に、引数で指定されたメッセージを追加する. * @param fileName ファイル名(追加Blob) * @param message メッセージ */ public void writeAppendBlob(String fileName, String message) { // 未指定の項目がある場合、何もしない if(StringUtil.isNullOrEmpty(storageAccountName) || StringUtil.isNullOrEmpty(storageAccessKey) || StringUtil.isNullOrEmpty(storageContainerName) || StringUtil.isNullOrEmpty(fileName) || StringUtil.isNullOrEmpty(message)) { return; } // ファイルアップロード処理 try { // Blob内のコンテナー内に、指定したファイル(追加Blob)を作成する AppendBlobClient appendBlobClient = getBlobContainerClient() .getBlobClient(fileName).getAppendBlobClient(); if(!appendBlobClient.exists()) { appendBlobClient.create(); } // Blob内のコンテナー内の指定したファイル(追加Blob)に、指定したメッセージを追記モードで書き込む byte[] data = message.getBytes(characterCode); appendBlobClient.appendBlock(new ByteArrayInputStream(data), data.length); } catch(Exception ex) { throw new RuntimeException(ex); } } /** * 引数で指定されたファイル(追加Blob)が存在する場合、削除する. * @param fileName ファイル名(追加Blob) */ public void deleteAppendBlob(String fileName) { // 未指定の項目がある場合、何もしない if(StringUtil.isNullOrEmpty(storageAccountName) || StringUtil.isNullOrEmpty(storageAccessKey) || StringUtil.isNullOrEmpty(storageContainerName) || StringUtil.isNullOrEmpty(fileName)) { return; } // Blob内のコンテナー内の指定したファイル(追加Blob)が存在する場合、削除する try { AppendBlobClient appendBlobClient = getBlobContainerClient() .getBlobClient(fileName).getAppendBlobClient(); if(appendBlobClient.exists()) { appendBlobClient.delete(); } } catch (Exception ex) { throw new RuntimeException(ex); } } /** * Blobコンテナクライアントオブジェクトを取得する. * @return Blobコンテナクライアントオブジェクト */ private BlobContainerClient getBlobContainerClient() { // Blobサービスクライアントオブジェクトを取得 BlobServiceClient blobServiceClient = new BlobServiceClientBuilder() .connectionString(storageConnectionString).buildClient(); // Blobコンテナクライアントオブジェクトを取得 BlobContainerClient blobContainerClient = blobServiceClient .getBlobContainerClient(storageContainerName); return blobContainerClient; } }
その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/azure/tree/master/azure-functions-db-to-csv-container-client/demoAzureFunc
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、下記記事の「サンプルプログラムの実行結果」と同じ結果となる。
Spring BatchのChunkモデルを利用したバッチで中間ファイルを作らずCSVファイルを出力してみた以下の記事で、Spring BatchのChunkモデルを利用したバッチで、DBのデータをAzure Blob StorageにCSVフ...
要点まとめ
- Spring BatchのCSVファイルを出力する際の、Azure Blob Storageにアクセスする処理で、CloudBlobContainerクラスだけなく、BlobContainerClientクラスを利用することもできる。