BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

Service Bus の Queue を Logic Apps で処理する(時にjsonのパースでエラーになる)

とある情報共有用なので説明を省略しまくってますが、まずやりたいことは以下。

  • Console App で Service Bus の キュー にメッセージを投げる
  • Service Bus の キュー にメッセージが入ったのトリガーに動く Logic Apps で、Storage の キュー に投げる

ってやる時の注意点です。

(あまり詳しく見てないのでもっとよいプラクティスがあるかも。)

Logic Apps の設定

f:id:beachside:20171129211848p:plain

超ざっくりな説明ですが、Service Bus の QueueトリガーのLogic Appsを作って、Storage の Queueに投げる際のメッセージには、以下の式を設定します。

json(base64ToString(triggerBody()?['ContentData']))

base64エンコードの式を使わないとエラーになりますが、エラーで表示されるContentをみればbase64エンコード必要だって察することができます♪

Console App で Service Bus に Queue なげる

Console から SDK(Nuget: WindowsAzure.ServiceBus v4.1.6)を使ってQueueを投げてます。 メッセージを作る際、json を string で以下のように作ると、Logic Appではうまく認識できなかったです....

// こんなオブジェクトをjsonにして送る例...
var item = new Item
{
    id = Guid.NewGuid().ToString(),
    name = "FromSB",
    price = 444
};

var json = JsonConvert.SerializeObject(item);
// うまくいかん!
var message = new BrokeredMessage(json);

具体的には、Logic Apps側のStorageのQueueに投げるところで以下のエラーがでます。

InvalidTemplate. 行 '1'、列 '2735' のアクション 'キューにメッセージを入れます' 入力でテンプレート言語式を処理できません: 'テンプレート言語関数 'json' のパラメーターが無効です。指定した値 '@string3http://schemas.microsoft.com/2003/10/Serialization/�I{"id":"59835c93-0950-4f16-8f36-28e80f3b2638","name":"FromSB","price":444}' を解析できません: 'Unexpected character encountered while parsing value: @. Path '', line 0, position 0.'。使用方法の詳細については、https://aka.ms/logicexpressions#json をご覧ください。

値に明らかに変な文字があるなーって感じなので、MemoryStream でメッセージを作ってあげると正常に動きました。

// こんなオブジェクトをjsonにして送る例...
var item = new Item
{
    id = Guid.NewGuid().ToString(),
    name = "FromSB",
    price = 444
};

var stream = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(item)));
var message = new BrokeredMessage(stream);

とりあえず問題なく動作しますが、詳しいことはドキュメントでもみないとわからんかなーって感じでしょうか。 ってかAzure の Paas 周りは仕事で使ってますが、Logic Apps と Service Bus は(実は)初めてさわったので何も知らん....

Logic Apps王子の縄神さま(Ahf)に、今度あった時に聞いてみよう思った今日この頃でした♪

そしてこれ書いてるときに iPhone Xが届いたー♪