Muleのメッセージ構造を理解する(ペイロードと変数と属性)

Muleを学ぶにあたり、頻繁に使用することになるペイロードと変数について。違いと使い方を簡単にまとめてみました。

スポンサーリンク

今回使うコンポーネント

今回メインで取り上げるコンポーネントは2つ。ペイロードに対する値のセットである「Set Payload」と変数に対して値をセットする「Set Variable」を使用します。

コンポーネントアイコン用途
Set Payloadペイロードに値を設定する
Set Variable変数に値を設定する

ペイロードの特徴

  • 各コンポーネントの処理が実施された際に直後の値をペイロード値に格納する
  • ペイロードに記録しないコンポーネントもある(Choice、Loggerなど)
  • ペイロードに記録しないコンポーネントは前のペイロード値を引き継ぐ
  • message.payloadから参照可能(messageは省略できる)

ペイロードはフロー内のコンポーネントの処理が完了するたびに、コンポーネントの処理結果をメッセージ内の「payload」という領域に格納します。

ペイロードの格納状況を調べるため、以下のようなフローを作成して検証してみます。

payload値を検証するためのフロー

上記、ValueやMessageに値をセットする際、payloadや変数を参照する場合はfxのボタンをONにします。fxのボタンをOFFにした場合はテキストに設定した内容を文字列として扱います。

各コンポーネントの処理については、以下のようになっています。

  1. 「吾輩は猫である」をペイロードに格納(猫→payload)
  2. ペイロードの内容をログ出力(ここではpayloadは変化しない)
  3. 「吾輩は犬である」をペイロードに格納(犬→payload)
  4. ペイロードの内容をログ出力(ここではpayloadは変化しない)

上記の状態でフローを実行すると、ログが以下のように記載されます。コンソールに出力される余分な文言については省略しています(かっこ内は説明用のため実際には出力されません)。

吾輩は猫である  (←2のログ内容、payload)
吾輩は犬である  (←4のログ内容、payload)

payloadが猫から犬に変わったことが分かりました。上のようにpayloadを使い回してしまうと猫が消えてしまうため、変数を使って猫を保持してみます。

変数の特徴

変数はMuleメッセージ領域と異なる領域にメモリ確保されます。ペイロードはコンポーネント単位で書き変わってしまいますが、変数は明示的に書き換えない限りは保持されます

  • Set Variableコンポーネントで指定した変数に値を格納する
  • Remove Variableしない限りは保持される
  • vars.{変数名}で参照可能

上記ペイロードを検証するフローでは猫が消えてしまうので、猫が残るように変数を入れてみます。Set Variableコンポーネントを使って先ほど消えてしまったpayload値を変数に退避します。

payload値を変数に退避したフロー

各コンポーネントの処理については、以下のようになっています。

  1. 「吾輩は猫である」をpayloadに格納(猫→payload)
  2. ペイロード値を変数catに格納(paylaod→cat)
  3. ペイロードの内容をログ出力
  4. 「吾輩は犬である」をペイロードに格納(犬→payload)
  5. ペイロードの内容をログ出力
  6. catの内容をログ出力

上記の状態でフローを実行すると、ログが以下のように記載されます(かっこ内は説明用のため実際には出力されません)。

吾輩は猫である  (←3のログ内容、payload)
吾輩は犬である  (←5のログ内容、payload)
吾輩は猫である  (←6のログ内容、変数cat)

これで無事猫が存在できるようになりました。

属性の特徴

  • パラメータやヘッダー情報を保持している領域
  • イベント開始のタイミングで自動的に設定される
  • 基本的にはパラメータの取得に使う
  • message.attributesから参照可能(messageは省略できる)

メッセージの本文・ペイロードに関連するメタデータ情報が属性(attribute)に格納されます。定義上の説明だといまいちピンと来ませんが、メールを例に例えると、メール本文がペイロードなのに対し、宛先や送信元などの情報が属性に当たります。

属性情報はイベントによって付与される情報が異なり、HTTP Listeneであれば、URIやパラメータやメソッドなどの情報が格納されます。属性情報を直接手を加えるというよりは、パラメータなどの情報を取得する場面が多いです。

実際にattributeを参照する場合は、message.attributesを使用します(messageは省略可能)。HTTP Listenerでattributeを出力するフローを作りました。attributeの値をペイロードに入れています(見やすさのためにJSONに変換しています)。

attribute属性の参照

出力結果はこのようになります。クエリパラメータを使うと、queryParamsに内容が表示されていることがわかります。

attributesの内容確認

最後に

ペイロード、属性情報、変数の使い分けについて簡単にお伝えしました。ペイロードは頻繁に使う領域になるため、今後複雑なフローになったときに見失わないようにしましょう。

次回はもっと複雑な変換を要するコンポーネントを扱っていきたいと思います。

MuleSoft
スポンサーリンク

コメント