Muleを学ぶにあたり、頻繁に使用することになるペイロードと変数について。違いと使い方を簡単にまとめてみました。
今回使うコンポーネント
今回メインで取り上げるコンポーネントは2つ。ペイロードに対する値のセットである「Set Payload」と変数に対して値をセットする「Set Variable」を使用します。
コンポーネント | アイコン | 用途 |
---|---|---|
Set Payload | ペイロードに値を設定する | |
Set Variable | 変数に値を設定する |
ペイロードの特徴
- 各コンポーネントの処理が実施された際に直後の値をペイロード値に格納する
- ペイロードに記録しないコンポーネントもある(Choice、Loggerなど)
- ペイロードに記録しないコンポーネントは前のペイロード値を引き継ぐ
- message.payloadから参照可能(messageは省略できる)
ペイロードはフロー内のコンポーネントの処理が完了するたびに、コンポーネントの処理結果をメッセージ内の「payload」という領域に格納します。
ペイロードの格納状況を調べるため、以下のようなフローを作成して検証してみます。
各コンポーネントの処理については、以下のようになっています。
- 「吾輩は猫である」をペイロードに格納(猫→payload)
- ペイロードの内容をログ出力(ここではpayloadは変化しない)
- 「吾輩は犬である」をペイロードに格納(犬→payload)
- ペイロードの内容をログ出力(ここではpayloadは変化しない)
上記の状態でフローを実行すると、ログが以下のように記載されます。コンソールに出力される余分な文言については省略しています(かっこ内は説明用のため実際には出力されません)。
吾輩は猫である (←2のログ内容、payload)
吾輩は犬である (←4のログ内容、payload)
payloadが猫から犬に変わったことが分かりました。上のようにpayloadを使い回してしまうと猫が消えてしまうため、変数を使って猫を保持してみます。
変数の特徴
変数はMuleメッセージ領域と異なる領域にメモリ確保されます。ペイロードはコンポーネント単位で書き変わってしまいますが、変数は明示的に書き換えない限りは保持されます。
- Set Variableコンポーネントで指定した変数に値を格納する
- Remove Variableしない限りは保持される
- vars.{変数名}で参照可能
上記ペイロードを検証するフローでは猫が消えてしまうので、猫が残るように変数を入れてみます。Set Variableコンポーネントを使って先ほど消えてしまったpayload値を変数に退避します。
各コンポーネントの処理については、以下のようになっています。
- 「吾輩は猫である」をpayloadに格納(猫→payload)
- ペイロード値を変数catに格納(paylaod→cat)
- ペイロードの内容をログ出力
- 「吾輩は犬である」をペイロードに格納(犬→payload)
- ペイロードの内容をログ出力
- catの内容をログ出力
上記の状態でフローを実行すると、ログが以下のように記載されます(かっこ内は説明用のため実際には出力されません)。
吾輩は猫である (←3のログ内容、payload)
吾輩は犬である (←5のログ内容、payload)
吾輩は猫である (←6のログ内容、変数cat)
これで無事猫が存在できるようになりました。
属性の特徴
- パラメータやヘッダー情報を保持している領域
- イベント開始のタイミングで自動的に設定される
- 基本的にはパラメータの取得に使う
- message.attributesから参照可能(messageは省略できる)
メッセージの本文・ペイロードに関連するメタデータ情報が属性(attribute)に格納されます。定義上の説明だといまいちピンと来ませんが、メールを例に例えると、メール本文がペイロードなのに対し、宛先や送信元などの情報が属性に当たります。
属性情報はイベントによって付与される情報が異なり、HTTP Listeneであれば、URIやパラメータやメソッドなどの情報が格納されます。属性情報を直接手を加えるというよりは、パラメータなどの情報を取得する場面が多いです。
実際にattributeを参照する場合は、message.attributesを使用します(messageは省略可能)。HTTP Listenerでattributeを出力するフローを作りました。attributeの値をペイロードに入れています(見やすさのためにJSONに変換しています)。
出力結果はこのようになります。クエリパラメータを使うと、queryParamsに内容が表示されていることがわかります。
最後に
ペイロード、属性情報、変数の使い分けについて簡単にお伝えしました。ペイロードは頻繁に使う領域になるため、今後複雑なフローになったときに見失わないようにしましょう。
次回はもっと複雑な変換を要するコンポーネントを扱っていきたいと思います。
コメント