動的ライタープロパティの使用

以下の例の Mule フローでは、カンマ区切りの CSV データをパイプ区切り (​|​) の CSV データに変換します。スクリプトでリテラル値を設定する代わりに、この例では、フロー内のデータ処理コンポーネントを通過する Mule イベントの一部である ​Mule 変数​からパイプ値を選択しています。例ではスクリプトの本文で DataWeave writer 関数を使用してカンマ区切りの入力をパイプ区切りの出力に変更します。

例の Scheduler コンポーネント (​<scheduler/>​) では、フローをトリガーするたびに Mule イベントを生成します。

Set Variable コンポーネント (​<set-variable/>​) では、値 ​'|'​ を含む ​delimiter​ という名前の Mule 変数を作成します。Studio では、値は単純な文字列 (​value="'|'"​) ではなく ​fx​ 式 (​value="#['|']"​) として作成されます。

Transform Message コンポーネント (​<ee:transform-message/>​) には、カンマ区切りの CSV 入力を読み取り、Mule 変数を使用してパイプ区切りの CSV 出力を書き込む DataWeave スクリプトが含まれます。

payload​ に設定された Logger コンポーネント (​<logger/>​) では、パイプ区切りの出力を INFO としてその ​LoggerMessageProcessor​ メッセージに書き込みます: macaroni | rigatoni | ravioli | spaghetti​。

Mule フロー:
<flow name="ex-use-mule-var-as-prop-config-val" >
  <scheduler doc:name="Scheduler" >
    <scheduling-strategy >
      <fixed-frequency frequency="45" timeUnit="SECONDS"/>
    </scheduling-strategy>
  </scheduler>
  <set-variable value="#['|']" doc:name="Set Variable" variableName="delimiter" />
  <ee:transform doc:name="Transform Message" >
    <ee:message>
      <ee:set-payload><![CDATA[%dw 2.0
var myVar = read("macaroni , rigatoni , ravioli , spaghetti", "application/csv" , {"header":false, separator:','})
output application/csv with binary
---
write(myVar, "application/csv", {"header":false, "separator":vars.delimiter})]]></ee:set-payload>
    </ee:message>
  </ee:transform>
  <logger level="INFO" doc:name="Logger" message="#[payload]"/>
</flow>

例のカンマ区切り入力を提供するため、Transform Message コンポーネントのスクリプトでは、​read​ 関数を DataWeave 変数 (​myVar​) への値として使用します:

var myVar = read("macaroni , rigatoni , ravioli , spaghetti", "application/csv" , {"header":false, separator:','})

パイプ区切りの出力を書き込むため、スクリプト本文の DataWeave ​write​ 関数では、カンマ区切りの入力をパイプ区切りの出力に変更します。Mule 変数 (​delimiter​) からパイプ値を選択するため、この関数ではライタープロパティ設定 ​"separator":vars.delimiter​ を引数として渡します:

write(myVar, "application/csv", {"header":false, "separator":vars.delimiter})

スクリプトでは DataWeave ​output​ ディレクティブ ​output application/csv with binary​ をスクリプトのヘッダーで使用しています。​write​ 関数で CSV 出力が返されたため、​with binary​ 設定 (​Mule 4.3.0 で導入済み​) を追加してバイナリライターを呼び出す必要があります。この設定がないと、DataWeave は CSV を再度書き込もうとするため、​CSV Structure should be an Array<Object> or Object but got String, while writing CSV.​ の問題が発生します。

Studio UI で Tranform Message コンポーネントの ​[Preview (プレビュー)]​ 画面からパイプ区切りのコンテンツを表示する場合は、そのサンプルデータを作成する必要があります。

  1. Studio アプリケーションの ​[Message Flow (メッセージフロー)]​ 領域から [Transform Message] コンポーネントをダブルクリックします。

  2. [Context (コンテキスト)]​ タブの ​[delimiter: String​]​ を右クリックします。これは、コンポーネントの設定 UI の左下にあります。

  3. [Edit Sample Data (サンプルデータの編集)]​ を選択して、​[vars-delimiter]​ タブを開きます。

  4. vars-delimiter​ のすべてのコンテンツを ​delimiter​ 値の次のサンプルデータで置き換えます: "|"​。区切り文字は引用符で囲む必要があります。

サンプルデータについての追加の指標は、​「変換出力のプレビュー」​を参照してください。