Dynamic Evaluate コンポーネント

Dynamic Evaluate コンポーネントは、式を評価して DataWeave スクリプトを選択し、新しいスクリプトを実行して結果を生成します。この動作により、​Transform Message コンポーネント​でハードコード化する代わりに、動的にスクリプトを選択できます。

スクリプトには、​message​、​payload​、​vars​、​attributes​ などの通常の​コンテキスト変数​を使用できますが、キー - 値ペアのセットを指定することによってカスタム変数を追加することもできます。

動的評価の設定

項目 説明

DataWeave 式

Mule が実行する DataWeave スクリプトを選択する式を指定します。

expression="#[vars.generateOrderScript]"

パラメータ

DataWeave 式

DataWeave スクリプトが評価するパラメータとして設定されるキー-値ペアを指定します。

#[{joiner: ' and ', id: payload.user.id}]

ファイルシステムから DataWeave スクリプトを評価する例

次の例は、Dynamic Evaluate コンポーネントで、ファイルシステムのローカルに保存されている DataWeave スクリプトを選択して実行する方法を示しています。アプリケーションのフロー動作は次のようになります。

  1. HTTP Listener ソースで、​locale​ クエリパラメータとペイロードを含む POST URL 要求をリスンします。

  2. File Read 操作で、HTTP 要求で受信した ​locale​ クエリパラメータを使用して、パラメータ名に一致する DataWeave スクリプトをローカルで検索します。

  3. File Read 操作で、スクリプトのコンテンツを新しい変数に保存します。

  4. Dynamic Evaluate コンポーネントで、変数に保存された DataWeave 式を実行します。

  5. Logger コンポーネントで、変換のペイロード結果をログに記録します。

ローカルに保存された DataWeave スクリプトは、ローカルではなくデータベースに保存することができ、ファイルシステムではなくデータベースからファイルを選択するようにアプリケーションを変更できます。これにより、アプリケーションのデプロイおよび実行中に任意の ​.dwl​ ファイルを置き換えることができ、アプリケーションを変更または再デプロイすることなく、実行する DataWeave スクリプトを変更できます。

この例では、2 つの DataWeave スクリプトを作成してローカルに保存し、Mule アプリケーションを作成して、アプリケーションを実行およびテストします。

Anypoint Studio での Dynamic Evaluate フローの例
Figure 1. Anypoint Studio での Dynamic Evaluate フローの例

DataWeave スクリプトの作成と保存

ファイルシステムから DataWeave スクリプトを評価する最初のステップは、スクリプトを作成してローカルに保存することです。

  1. Studio で新しい Mule プロジェクトを作成します。

  2. Package Explorer​ ウィンドウの Mule プロジェクト名の下で、​src/main/resources​ フォルダをクリックし、​[New (新規)] > [File (ファイル)]​ を選択します。

  3. [File name (ファイル名)]​ 項目で、名前 ​dw_en-US.dwl​ を追加して、新しい DataWeave スクリプトファイルを作成します。

  4. [Finish (完了)]​ をクリックします。

  5. dw_en-US.dwl​ ウィンドウで、次の DataWeave 式を貼り付けます。

    %dw 2.0
    output application/json
    ---
    {
        "First Name": payload.name,
        "Last Name": payload.last,
        "Country": payload.loc
    }
  6. 前の手順を繰り返して、次の DataWeave 式を含む ​dw_es-AR.dwl​ という名前の新しいファイルを作成します。

    %dw 2.0
    output application/json
    ---
    {
        "Nombre": payload.name,
        "Apellido": payload.last,
        "País": payload.loc
    }
  7. 変更を保存します。

Mule アプリケーションの作成

サンプルスクリプトを作成してローカルに保存したら、Studio で Mule アプリケーションを作成します。

  1. Package Explorer​ ウィンドウの ​src/main/mule (フロー)​ フォルダで、フローの ​.xml​ ファイルに移動します。

  2. [Mule Palette (Mule パレット)]​ ビューで、​HTTP Listener​ ソースを選択してキャンバスにドラッグします。
    ソースが受信 HTTP 要求をリスンすることでフローが開始します。

  3. [Path (パス)]​ 項目を ​/test​ に設定します。

  4. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の HTTP リスナのすべてのインスタンスで使用できるグローバル要素を設定します。

  5. [General (一般)]​ タブで、次の項目を設定します。

    • Host (ホスト)​: All Interfaces [0.0.0.0] (default)

    • Port (ポート)​: 8081

  6. [OK]​ をクリックします。

  7. [File Read]​ 操作を ​[HTTP Listener]​ の右にドラッグします。

  8. [Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックして、アプリケーション内の File Read 操作のすべてのインスタンスで使用できるグローバル要素を設定します。

  9. [General (一般)]​ タブで、​[Working Directory (作業ディレクトリ)]​ 項目を Studio プロジェクトと以前の DataWeave スクリプトを含むメインリソースフォルダに設定します。

    /Users/username/AnypointStudio/studio-workspace/dynamicevaluate/src/main/resources

  10. [OK]​ をクリックします。

  11. [File path (ファイルパス)]​ 項目で、パス ​#["dw_" ++ attributes.queryParams.locale ++ ".dwl"]​ を設定します。

    コネクタは、​dw_​ で始まり、HTTP 要求で受信した ​locale​ クエリパラメータ (​attributes.queryParams.locale​) を含む、ローカルに保存された DataWeave スクリプトファイル名を読み取ります。

  12. [Advanced (詳細)]​ タブで、​[Target Variable (対象変数)]​ 項目を ​dwScript​ に設定します。
    この変数には、ファイル検索に一致した DataWeave スクリプトが保存されます。

  13. [Dynamic Evaluate]​ コンポーネントを ​[File Read]​ の右にドラッグします。

  14. [Expression (式)]​ 項目を ​#[vars."dwScript"]​ に設定して、変数 ​dwScript​ に保存された一致する DataWeave スクリプトを実行します。

  15. [Target value (対象値)]​ 項目を ​payload​ に設定します。

  16. [Logger]​ コンポーネントを ​[Dynamic Evaluate]​ の右にドラッグします。

  17. [Message (メッセージ)]​ 項目を ​#[payload]​ に設定します。

  18. Mule アプリケーションを保存します。

Mule アプリケーションの実行とテスト

Mule アプリケーションを作成したら、実行してテストします。

  1. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)] > [Run As (別のユーザとして実行)] > [Mule Application (Mule アプリケーション)]​ をクリックします。

  2. 次のクエリパラメータ ​locale=en-US​ または ​locale=es-AR​ のいずれかを URL に追加して、POST 要求を ​http://localhost:8081/test​ に送信します。次に例を示します。
    http://localhost:8081/test?locale=en-US

    さらに、POST 要求で次のペイロードを送信します。

    {
    "name": "Max",
    "last": "The Mule",
    "loc": "Argentina"
    }
  3. Studio コンソールで、ログをスクロールして結果のメッセージを確認します。

    INFO  2021-01-19 11:18:25,559 [[MuleRuntime].uber.12: [dynamicevaluate].dynamicevaluateFlow.CPU_INTENSIVE @2588f400] [processor: dynamicevaluateFlow/processors/2; event: 319aacc0-5a61-11eb-bbb8-f01898ad2638] org.mule.runtime.core.internal.processor.LoggerMessageProcessor: {
      "First Name": "Max",
      "Last Name": "The Mule",
      "Country": "Argentina"
    }

ファイルシステムから DataWeave スクリプトを評価するための XML

この例のフローをすばやく Mule アプリケーションに読み込むには、次のコードを Studio XML エディタに貼り付けます。

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns:file="http://www.mulesoft.org/schema/mule/file"
	xmlns:http="http://www.mulesoft.org/schema/mule/http"
	xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
	<http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" >
		<http:listener-connection host="0.0.0.0" port="8081" />
	</http:listener-config>
	<file:config name="File_Config" doc:name="File Config" >
		<file:connection workingDir="/Users/ktroller/AnypointStudio/studio-workspace/dynamicevaluate/src/main/resources" />
	</file:config>
	<flow name="dynamicevaluateFlow" >
		<http:listener doc:name="Listener" config-ref="HTTP_Listener_config" path="/test"/>
		<file:read doc:name="Read" config-ref="File_Config" path='#["dw_" ++ attributes.queryParams.locale ++ ".dwl"]' target="dwScript"/>
		<ee:dynamic-evaluate doc:name="Dynamic Evaluate" expression='#[vars."dwScript"]'/>
		<logger level="INFO" doc:name="Logger" message="#[payload]"/>
	</flow>
</mule>

データベースから DataWeave スクリプトを評価する例

次の例では、​userId​ クエリパラメータを使用してデータベースからスクリプトを選択し、そのスクリプトを ​userScript​ 変数に保存します。​dynamic-evaluate​ コンポーネントは、​userScript​ 変数にアクセスし、指令された (​attributes.queryParams.userName​ の値を含む) パラメータ ​name​ を使用してスクリプトを呼び出します。

<flow name="dynamic-evaluate-example-flow">
  <http:listener config-ref="HTTP_Listener_Configuration" path="/"/>
  <!-- This SQL query uses queryParams.userId to dynamically select a DataWeave script stored in a Database,
  and then assign this script to target variable userScript-->
  <db:select config-ref="dbConfig" target="userScript">
    <db:sql>#["SELECT script FROM SCRIPTS WHERE ID = $(attributes.queryParams.userId)"]</db:sql>
  </db:select>
  <!-- The dynamic evaluate component executes the script stored in vars.userScript-->
  <ee:dynamic-evaluate expression="#[vars.userScript]">
    <!-- This line sets a parameter called 'name', so the expression in the Dynamic Evaluate component can use it -->
    <ee:parameters>#[{name: attributes.queryParams.userName}]</ee:parameters>
  </ee:dynamic-evaluate>
</flow>

次のスクリプトが例のデータベースのエントリ ​lsalander​ と ​mblomkvist​ にそれぞれ保存されているとします。

例: lsalander スクリプト
output application/json
---
{
  message: "Order " ++ attributes.queryParams.orderId ++ " has been received from " ++ name,
  items: payload.items
}
例: mblomkvist スクリプト
output application/x-www-form-urlencoded
---
{
  message: "Order " ++ attributes.queryParams.orderId ++ " has been received from " ++ name,
  items: payload.items
}

アプリケーション動作の例

このサンプル Mule アプリケーションが要求で ​lsalander​ を ​queryParams.userId​ として受け取ると、Mule は対応するスクリプトを実行して JSON 応答を返します。アプリケーションが ​mblomkvist​ を ​queryParams.userId​ 値として受け取った場合、Mule は別のスクリプトを実行して ​x-www-form-urlencoded​ 応答を返します。

この例は、ユーザに基づいて応答種別をパラメータ化でき、さらに各ユーザのニーズに合わせて応答全体をパラメータ化できることを示しています。