以下の記事で、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クラスを利用して行っている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | 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クラスを利用することもできる。