Dynamic Evaluate コンポーネントは、式を評価して DataWeave スクリプトを選択し、新しいスクリプトを実行して結果を生成します。この動作により、Transform Message コンポーネントでハードコード化する代わりに、動的にスクリプトを選択できます。
スクリプトには、message、payload、vars、attributes などの通常のコンテキスト変数を使用できますが、キー - 値ペアのセットを指定することによってカスタム変数を追加することもできます。
動的評価の設定
| 項目 | 値 | 説明 | 例 |
|---|---|---|---|
式 |
DataWeave 式 |
Mule が実行する DataWeave スクリプトを選択する式を指定します。 |
|
パラメーター |
DataWeave 式 |
DataWeave スクリプトが評価するパラメーターとして設定されるキー-値ペアを指定します。 |
|
ファイルシステムから DataWeave スクリプトを評価する例
次の例は、Dynamic Evaluate コンポーネントで、ファイルシステムのローカルに保存されている DataWeave スクリプトを選択して実行する方法を示しています。アプリケーションのフロー動作は次のようになります。
-
HTTP Listener ソースで、
locale クエリパラメーターとペイロードを含む POST URL 要求をリスンします。 -
File Read 操作で、HTTP 要求で受信した
locale クエリパラメーターを使用して、パラメーター名に一致する DataWeave スクリプトをローカルで検索します。 -
File Read 操作で、スクリプトのコンテンツを新しい変数に保存します。
-
Dynamic Evaluate コンポーネントで、変数に保存された DataWeave 式を実行します。
-
Logger コンポーネントで、変換のペイロード結果をログに記録します。
ローカルに保存された DataWeave スクリプトは、ローカルではなくデータベースに保存することができ、ファイルシステムではなくデータベースからファイルを選択するようにアプリケーションを変更できます。これにより、アプリケーションのデプロイおよび実行中に任意の .dwl ファイルを置き換えることができ、アプリケーションを変更または再デプロイすることなく、実行する DataWeave スクリプトを変更できます。
この例では、2 つの DataWeave スクリプトを作成してローカルに保存し、Mule アプリケーションを作成して、アプリケーションを実行およびテストします。
DataWeave スクリプトの作成と保存
ファイルシステムから DataWeave スクリプトを評価する最初のステップは、スクリプトを作成してローカルに保存することです。
-
Studio で新しい Mule プロジェクトを作成します。
-
Package Explorer ウィンドウの Mule プロジェクト名の下で、src/main/resources フォルダーをクリックし、[New (新規)] > [File (ファイル)] を選択します。
-
[File name (ファイル名)] 項目で、名前
dw_en-US.dwl を追加して、新しい DataWeave スクリプトファイルを作成します。 -
[Finish (完了)] をクリックします。
-
dw_en-US.dwl ウィンドウで、次の DataWeave 式を貼り付けます。
%dw 2.0 output application/json --- { "First Name": payload.name, "Last Name": payload.last, "Country": payload.loc } -
前の手順を繰り返して、次の DataWeave 式を含む
dw_es-AR.dwl という名前の新しいファイルを作成します。%dw 2.0 output application/json --- { "Nombre": payload.name, "Apellido": payload.last, "País": payload.loc } -
変更を保存します。
Mule アプリケーションの作成
サンプルスクリプトを作成してローカルに保存したら、Studio で Mule アプリケーションを作成します。
-
Package Explorer ウィンドウの src/main/mule (フロー) フォルダーで、フローの
.xml ファイルに移動します。 -
[Mule Palette (Mule パレット)] ビューで、HTTP Listener ソースを選択してキャンバスにドラッグします。
ソースが受信 HTTP 要求をリスンすることでフローが開始します。 -
[Path (パス)] 項目を
/test に設定します。 -
[Connector configuration (コネクタ設定)] 項目の横にあるプラス記号 (+) をクリックして、アプリケーション内の HTTP リスナーのすべてのインスタンスで使用できるグローバル要素を設定します。
-
[General (一般)] タブで、次の項目を設定します。
-
Host (ホスト):
All Interfaces [0.0.0.0] (default) -
Port (ポート):
8081
-
-
[OK] をクリックします。
-
[File Read] 操作を [HTTP Listener] の右にドラッグします。
-
[Connector configuration (コネクタ設定)] 項目の横にあるプラス記号 (+) をクリックして、アプリケーション内の File Read 操作のすべてのインスタンスで使用できるグローバル要素を設定します。
-
[General (一般)] タブで、[Working Directory (作業ディレクトリ)] 項目を Studio プロジェクトと以前の DataWeave スクリプトを含むメインリソースフォルダーに設定します。
/Users/username/AnypointStudio/studio-workspace/dynamicevaluate/src/main/resources -
[OK] をクリックします。
-
[File path (ファイルパス)] 項目で、パス
#["dw_" ++ attributes.queryParams.locale ++ ".dwl"] を設定します。コネクタは、
dw_ で始まり、HTTP 要求で受信した locale クエリパラメーター (attributes.queryParams.locale) を含む、ローカルに保存された DataWeave スクリプトファイル名を読み取ります。 -
[Advanced (詳細)] タブで、[Target Variable (対象変数)] 項目を
dwScript に設定します。
この変数には、ファイル検索に一致した DataWeave スクリプトが保存されます。 -
[Dynamic Evaluate] コンポーネントを [File Read] の右にドラッグします。
-
[Expression (式)] 項目を
#[vars."dwScript"] に設定して、変数 dwScript に保存された一致する DataWeave スクリプトを実行します。 -
[Target value (対象値)] 項目を
payload に設定します。 -
[Logger] コンポーネントを [Dynamic Evaluate] の右にドラッグします。
-
[Message (メッセージ)] 項目を
#[payload] に設定します。 -
Mule アプリケーションを保存します。
Mule アプリケーションの実行とテスト
Mule アプリケーションを作成したら、実行してテストします。
-
Package Explorer でプロジェクト名をクリックし、[Run (実行)] > [Run As (別のユーザーとして実行)] > [Mule Application (Mule アプリケーション)] をクリックします。
-
次のクエリパラメーター
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" } -
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 にそれぞれ保存されているとします。
output application/json
---
{
message: "Order " ++ attributes.queryParams.orderId ++ " has been received from " ++ name,
items: payload.items
}
output application/x-www-form-urlencoded
---
{
message: "Order " ++ attributes.queryParams.orderId ++ " has been received from " ++ name,
items: payload.items
}