機能構成・概要
- Functions①:httpトリガー。webページを表示した際に実行される。受け取ったメッセージをQueue Storageに格納する。
- Queue Storage:Functions①からのメッセージを一時的に格納。
- Functions②:Azure Queue Storageトリガー。Queueにメッセージが格納されたときに実行される。Queueから取り出したメッセージを加工し、Blob Storage内のファイルに
追記
する。 - Blob Storage:ファイルの配置場所。ファイルは現状1つで、Functions②により追記される。
処理概要
- Webページ表示
- Functions①実行(Functions①のURL実行)
- メッセージをQueue Storageに格納
- 3をトリガーとして、Functions②を実行
- メッセージを加工して、Blob Storage内のファイルに
追記
やりたいこと
- ほぼ同時にQueue Storageに入ったデータを過不足なく、Blob Storage内のファイルに追記したい。
(Functions②が実行中に別のFunctions②を実行しないか、
Queue Storage内のメッセージをすべて、1つのFunctions②でBlob Storage内のファイルに格納するか。)
課題・問題点
- 現状、Queue Storageに同時に10個メッセージが入った場合、Functions②が10個同時に実行され、処理がバッティングしてしまう。
- したがって、Blob Storageのファイルには、10個分のメッセージは追記されず、1個分とか2個分のみ追記されてしまう。
エラー内容
The specified block list is invalid.
コード
C#
1/*Functions②*/ 2#r "Newtonsoft.Json" 3 4using System; 5using Newtonsoft.Json; 6using System.Threading; 7 8public static void Run( 9 string queue01, 10 string Blob01In, 11 out string Blob01Out, 12 ILogger log) 13{ 14 //JSONデータからC#オブジェクト作成 15 dynamic jsonData = JsonConvert.DeserializeObject(queue01); 16 //C#オブジェクト⇒CSVデータ 17 string csvData = jsonData.clm1 + "," + jsonData.clm2; 18 19 //Blobの内容にQueueの内容を追記 20 Blob01Out = Blob01In + csvData + System.Environment.NewLine; 21 Thread.Sleep(5000); 22 log.LogInformation("処理終了"); 23}
(Sleepは、処理がバッティングしていることをわかりやすくしているために使用しています。ログ出力も同様)
json
1/*Function.json*/ 2{ 3 "bindings": [ 4 { 5 "name": "queue01", 6 "type": "queueTrigger", 7 "direction": "in", 8 "queueName": "queue01", 9 "connection": "AzureWebJobsStorage" 10 }, 11 { 12 "type": "blob", 13 "name": "Blob01Out", 14 "path": "test01/test.csv", 15 "connection": "AzureWebJobsStorage", 16 "direction": "out" 17 }, 18 { 19 "type": "blob", 20 "name": "Blob01In", 21 "path": "test01/test.csv", 22 "connection": "AzureWebJobsStorage", 23 "direction": "in" 24 } 25 ] 26}
Azure機能にあまり詳しくないため、不備等ございましたら、
補足致しますので、お力添えをお願いいたします。
補足(20181227)
それっぽい情報は見つかりましたが、記事通り、host.jsonに追記しても、何も変化はありません・・・
https://4423lab.wpblog.jp/archives/548

回答3件
あなたの回答
tips
プレビュー